尊重夏令时的时差

时间:2013-12-12 20:59:23

标签: java datetime clojure jodatime clj-time

我有两个long代表自纪元以来的时间。他们都有相同的时区。我希望在这两次之间找到差异以秒为单位,尊重日光节省。

(def a (java.util.Date. 1259568796000))  ;; Before Day Light Savings

(def b (java.util.Date. 1255147200000))  ;; After Day Light Savings

'a'是2009-11-30T08:13:16.000-00:00

'b'是2009-10-10T04:00:00.000-00:00

使用JodaTime,我可以将这两次Interval变为Duration,然后获取StandardSeconds

(.getStandardSeconds (.toDuration (Interval. a b)))

这不起作用,因为Period的文档表明Duration会破坏日光节约:

  

当此时间段添加到瞬间时,效果是添加   每个领域依次。因此,这考虑了日光   节省时间。在日光前一天添加1天的时间段   储蓄开始只会增加23小时而不是24小时来确保   时间保持不变。如果这不是你想要的行为,那么   见持续时间。

我该如何完成这项任务?

2 个答案:

答案 0 :(得分:3)

Java中的long表示某个时间点(自1970年1月1日午夜起的毫秒数,忽略闰秒)。它们没有时区,也没有夏令时切换,它始终以UTC表示。要找到两个这样的时间点之间的差异,您可以使用

(secondTime - firstTime) / 1000

您给出的两次用GMT表示,即

1259568796000 = 2009-11-30T08:13:16.000-00:00 GMT
1255147200000 = 2009-10-10T04:00:00.000-00:00 GMT

GMT也没有转向夏令时。也许你对此感到困惑。

答案 1 :(得分:0)

java.util.Calendar课程支持夏令时。或许可以通过第一次运行您的日期?它应该为你做标准化。看看这个other post