当前位置: 首页 > 知识库问答 >
问题:

从Excel datetime转换为ZonedDateTime

翟永春
2023-03-14

Excel中的datetime保存为1900-01-01之后的天数(1,因为它认为1900-02-29发生了)。数字中的分数是一天中的时间偏移量。

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

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

这就引出了一个问题,如何在本地时区创建一个ZonedDateTime,设置为这个Excel日期时间编号?

共有1个答案

邹毅
2023-03-14
    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,因此对于一个面向未来的解决方案,您可以考虑单独添加整日,并且只将分数转换为纳米。

 类似资料:
  • 我有一个接口和枚举,如下所示: 现在,为了调用,我创建了一个包含所有元素的枚举集,因此执行以下操作:

  • 我如何将此代码从juqery转换为vuejs? 此处的Javascript测试:https://codepen.io/tidiosupport/pen/wnepeao

  • 到目前为止,我在这里找到了一些答案,但每次都会出现无法从对象转换为字符串的错误,等等。例如,我现在使用了这个想法: 我有以下与我的数据库映射的对象列表:

  • 然后输入LDA: 但是在Java API中,我使用以下代码获得了CountVectorizerModel: 像这样: 我使用的是Spark和MLlib 1.5.1以及Java8 任何帮助都是非常感谢的。谢谢,当我试图从DataFrame转换为JavaPairRDD时,这里是异常日志文件

  • 问题内容: 我想知道是否有任何方法可以将Integer类型的变量转换为BigInteger。我尝试类型转换Integer变量,但出现一个错误消息,指出不可转换的类型。 问题答案: 您想要的方法是BigInteger#valueOf(long val) 。 例如, 首先创建String是不必要的,也是不希望的。

  • 问题内容: 我正在使用Jongo与Mongo一起工作,当我执行查询时会收到结果。 问题是,如果json是content ,它将不是from的唯一方法。 我如何获得原件? 我没有要映射的地图,也不是创建类的解决方案,这就是为什么我使用 问题答案: 如果您可以访问某些JSON库,那似乎就是这样。 如果使用org.json库,请使用: 如果是Gson,请使用@hellboy提到的方法: