从Excel日期时间转换为ZonedDateTime

时间:2019-03-14 13:20:15

标签: excel java-time zoneddatetime excel-dates

Excel中的日期时间保存为自1900-01-01以来的天数(+1认为是1900-02-29发生了)。数字中的分数是一天中的时间偏移。

该数字没有时区的概念。因此,在您打开电子表格的时区中,12.5是1900-01-12T12:00:00。在科罗拉多州打开它并显示中午。在德国打开它并显示中午。这不是瞬间,而是LocalDateTime。

对于我们将所有内容存储为OffsetDateTime或ZonedDateTime(取决于日期时间如何传递给我们的系统)的系统,我认为逻辑上的事情是从此创建ZonedDateTime。

哪个导致了一个问题,如何在本地时区中创建一个设置为此Excel日期时间数字的ZonedDateTime?

1 个答案:

答案 0 :(得分:0)

    LocalDate msBaseDate = LocalDate.of(1899, Month.DECEMBER, 31);

    double dateFromExcel = 12.5;
    long nanosSinceBase = Math.round(dateFromExcel * TimeUnit.DAYS.toNanos(1));
    ZonedDateTime dateTime = msBaseDate.atStartOfDay()
            .plusNanos(nanosSinceBase)
            .atZone(ZoneId.systemDefault());

    System.out.println(dateTime);

在我的计算机上,输出为:

  

1900-01-12T12:00 + 01:00 [欧洲/哥本哈根]

由于java.time仅使用整数,因此使用了其最精细的粒度(纳秒)。这将在2192年使long溢出,因此对于面向未来的解决方案,您可以考虑单独添加整天,并且仅将分数转换为纳秒。