从 Excel 日期时间转换为 ZonedDateTime
Convert from Excel datetime to ZonedDateTime
Excel 中的日期时间被保存为自 1900-01-01 以来的天数(+1,因为它认为 1900-02-29 发生了)。数字中的小数部分是当天的时间偏移。
这个号码没有时区概念。所以 12.5 在您打开电子表格的时区是 1900-01-12T12:00:00。在科罗拉多州打开它,它显示中午。在德国打开它显示中午。不是瞬间,是 LocalDateTime。
对于我们将所有内容存储为 OffsetDateTime 或 ZonedDateTime 的系统(取决于日期时间是如何传递给我们的),我认为合乎逻辑的做法是从中创建一个 ZonedDateTime。
这引出了一个问题,我如何创建一个 ZonedDateTime,设置为本地时区的这个 Excel 日期时间数字?
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[Europe/Copenhagen]
由于java.time只使用整数,我使用它的最细粒度,纳秒。这将在 2192 年溢出 long
,因此对于面向未来的解决方案,您可以考虑单独添加所有天数并且只将分数转换为纳米。
Excel 中的日期时间被保存为自 1900-01-01 以来的天数(+1,因为它认为 1900-02-29 发生了)。数字中的小数部分是当天的时间偏移。
这个号码没有时区概念。所以 12.5 在您打开电子表格的时区是 1900-01-12T12:00:00。在科罗拉多州打开它,它显示中午。在德国打开它显示中午。不是瞬间,是 LocalDateTime。
对于我们将所有内容存储为 OffsetDateTime 或 ZonedDateTime 的系统(取决于日期时间是如何传递给我们的),我认为合乎逻辑的做法是从中创建一个 ZonedDateTime。
这引出了一个问题,我如何创建一个 ZonedDateTime,设置为本地时区的这个 Excel 日期时间数字?
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[Europe/Copenhagen]
由于java.time只使用整数,我使用它的最细粒度,纳秒。这将在 2192 年溢出 long
,因此对于面向未来的解决方案,您可以考虑单独添加所有天数并且只将分数转换为纳米。