java - 如何使用 java.time 将带有可选时间的日期时间输入字符串转换为 UNIX 时间

标签 java datetime java-time

我正在使用 java.time 将日期时间转换为 unix 时间,但是当我有不同的输入格式时,结果并不总是正确的。在下面的代码中,输出不正确。它将“2016-06-21-10-19-22”转换为 2016-06-21T00:00:00+00:00。

如果输入“04/28/2016”,“MM/dd/yyyy”,则结果正确。

我想知道如何编写一个可以将带时间的日期和不带时间的日期转换为正确的 timeInSeconds 的函数?

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
                "yyyy-MM-dd-HH-mm-ss");
        String dateTimeString = "2016-06-21-10-19-22";
        LocalDate date = LocalDate.parse(dateTimeString, formatter);

        ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC"));

        Instant i = resultado.toInstant();
        long timeInSeconds = i.getEpochSecond();
        int nanoAdjustment = i.getNano();

        System.out.println("" + timeInSeconds + " seconds " + nanoAdjustment + " nanoseconds");//1466467200 seconds 0 nanoseconds


enter image description here

最佳答案

你的代码有多个问题,让我一一列举

  • 您总是将输入字符串解析为 LocalDate , 甚至代表时间
  • LocalDate date = LocalDate.parse("2016-06-21-10-19-22", formatter);  //2016-06-21 
    
    LocalDate date = LocalDate.parse("2016-06-21", formatter);  //2016-06-21
    
  • 将输入字符串解析为 LocalDate 后,你总是把它转换成 ZoneDateTime一天的开始时间是 00:00:00
  •  ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC"));   //2016-06-21T00:00Z[UTC]
    
  • 最后你正在转换相同的 ZonedDateTime进入 Instant与输入的时间无关,这就是为什么您总是得到相同的结果
  • Instant i = resultado.toInstant().getEpochSecond();  //1466467200
    

    解决此问题的最佳方法是使用 DateTimeFormatter在格式化程序中使用可选的时间表示,并使用 parseBest
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd[-HH-mm-ss]");
    
    TemporalAccessor dt = parser.parseBest(dateTimeString, LocalDateTime::from, LocalDate::from);
    
    if (dt instanceof LocalDateTime) {
           (LocalDateTime) dt).atOffset(ZoneOffset.UTC).toInstant();
      } else {
           (LocalDate) dt).atStartOfDay(ZoneOffset.UTC).toInstant();
     }
    

    关于java - 如何使用 java.time 将带有可选时间的日期时间输入字符串转换为 UNIX 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61492388/

    相关文章:

    java - 将日期时间转换为字符串,时间错误

    php - "datetime-local"空输入导致MySQL查询失败

    java - 最后一个工作日期非假期

    java - 将三个 LocalDate 转换为 YearMonth

    java - 如何从给定的 Instant 获取第二天结束的日期时间? ( java )

    java - 解析为 YearMonth

    java - Jetty+Jersey,意外异常: Asynchronous processing not supported on Servlet 2. x容器

    java - 使用 ShapeRenderer 缩放 libGDX 中渲染的形状

    java - 代码块在 Android Studio 中无法运行,但在 Eclipse 中运行良好?

    java - Hibernate Union 替代方案