java - 使用 Java 日历时忽略 DST

标签 java calendar dst

我有一个绘制时间序列图的 GUI。用户通过在文本框中输入值来输入他们想要绘图的日期。例如,如果他们输入 25/07/13 22:0026/07/13 00:00,图表应该绘制来自25 日 22:00:00 至次日凌晨 00:00:59。用户输入的时间被解析为 Calendar 对象。

我的问题来自 DST。

用户不关心 DST,所以他们只想看到这两个时间之间的图表。但是,Calendar 对象确实关心 DST,因此我的“结束”日期当前不是 00:00,而是 01:00。 (我在伦敦,我们目前是 GMT + 1 小时 DST)。

我想在绘制图表时有效地忽略 DST 并表现得好像一切都是 GMT + 0。

我该怎么做?

最佳答案

感谢大家的回答,他们帮助我解决了这个问题。这归结为我同时使用 Calendar 对象来表示和存储数据,以及使用 epoch 来进行时间计算。

事实证明,Calendar set() 方法会理所当然地考虑 DST。因此,当我解析用户输入的文本框中的时间值,并对每个单独的 Calendar 字段使用 set() 时,Calendar对象将根据历史数据知道您刚设置的日期是否应用夏令时。因此,它可以理解您的意思,例如 GMT+1,即使您没有意识到这一点(因为,坦率地说,谁知道?!)。

但是,当您执行 getTimeInMillis() 时,返回的 epoch 没有时区或 DST 的概念,因此要与当前时区,如果适用,您必须将 DST 手动应用到返回的 epoch。相反,当您在 Calendar 对象上使用 setTimeInMillis() 时,假设您输入的时间是 GMT+0,但是如果epoch 是当前已应用 DST 的日期,Calendar 对象会为您添加它,这意味着您距离您认为的时间还有 +1 小时。要解决此问题,您需要在将 epoch 设置到日历中之前,在必要时再次减去 DST。

所有这些混淆在日期界限上尤为重要,尤其是如果您像我一样使用日期解决方案。

关于java - 使用 Java 日历时忽略 DST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17854931/

相关文章:

java - 如何修复已弃用的 .getDate()

java - 如何使用日历生成开始和结束时间?

java.util.Date 计算天数差异

Java:带有涉及数组的方法的 Switch 语句

java - 在 Scanner 类中采用可变参数

java - ZMQ (Jeromq) - 套接字发送文档中缺少参数

java - 从日期范围选择中选择第一个和最后一个日期

java - 基于 LocalDateTime 创建 ZonedDateTime 实例时出现问题

不同语言环境和时区的 Javascript 日期对象

java - Java 的最佳 XML 解析器