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

问题描述 投票:2回答:1

我正在使用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

java datetime java-time
1个回答
1
投票

您的代码中有多个问题,让我尝试一一列出

  1. 您总是将输入字符串解析为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
  1. 将输入字符串解析为LocalDate后,您始终将其转换为ZoneDateTime并以一天的开始时间为00:00:00
 ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC"));   //2016-06-21T00:00Z[UTC]
  1. 最后,无论输入时间如何,都将相同的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();
 }
© www.soinside.com 2019 - 2024. All rights reserved.