我有一个绘制时间序列图的 GUI。用户通过在文本框中输入值来输入他们想要绘图的日期。例如,如果他们输入 25/07/13 22:00 和 26/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/