【问题标题】:Convert from Excel datetime to ZonedDateTime从 Excel 日期时间转换为 ZonedDateTime
【发布时间】:2019-08-05 09:56:07
【问题描述】:

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

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

对于我们将所有内容存储为 OffsetDateTime 或 ZonedDateTime(取决于将日期时间传递给我们的方式)的系统,我认为合理的做法是从中创建一个 ZonedDateTime。

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

【问题讨论】:

  • 您可以将日期时间作为 UDT 存储在隐藏列中,并使用 UDF 从各个机器的系统区域设置中检索时区偏移量来进行调整。
  • 这可能有一些有用的信息superuser.com/questions/763996/…

标签: excel java-time zoneddatetime excel-dates


【解决方案1】:
    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,因此对于面向未来的解决方案,您可以考虑单独添加整天,并且仅将分数转换为 nanos。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2022-01-06
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多