【问题标题】:How to convert date time input string with optional time into UNIX time using java.time如何使用 java.time 将带有可选时间的日期时间输入字符串转换为 UNIX 时间
【发布时间】:2020-04-29 00:46:57
【问题描述】:

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

【问题讨论】:

    标签: java datetime java-time


    【解决方案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();
     }
    

    【讨论】:

    • 嗨@Deadpool,我尝试了 parseBest() 但仍然得到错误的答案,我编辑了我的问题,请看一下。
    • 检查我更新的代码,parseBest 中的顺序很重要@zzxdw
    • 感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2019-02-24
    • 2011-03-16
    相关资源
    最近更新 更多