在计算2次之间的差值时补偿BST

时间:2014-01-02 22:58:23

标签: java datetime

我需要一些正确方向的帮助或指针。

我想要获得2次之间的差异。我在GMT的英国,时区设置为自动调整夏令时。

当我执行以下操作时,它总是1小时,除非我自动关闭以进行夏令时调整。

String strDate = new java.text.SimpleDateFormat("HH:mm:ss").format(new Date().getTime() - oldDate.getTime());

如果我运行以下内容,那么2小时差异不大。

System.out.println("Current time " + Formats.HOURMIN.formatValue(new Date().getTime()));
System.out.println("Old time " + Formats.HOURMIN.formatValue(oldDate.getTime())); 

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

计算涉及不同时区的时间间隔的基本规则是确保在减去之前将时间转换为UTC。

每次,无论当时有什么区域和DST偏移有效(双关语都有意),都会转换为唯一的UTC时刻。一旦你有UTC时间,计算差异是一个简单的减法。结果是与时区无关的。

答案 1 :(得分:1)

java.util.Date类没有附加时区,但在呈现字符串时却混淆地使用了您的默认时区。我猜这可能是你的问题。避免java.util.Date/Calendar类的众多原因之一。


Joda-Time 2.3库使这种工作更容易。查看PeriodDurationInterval类。

与java.util.Date相反,在Joda-Time中,DateTime实例确实知道其指定的时区。

ISO 8601标准定义了一种以PnYnMnDTnHnMnS格式将durations描述为小时,分钟等的方法。我在下面的示例代码中使用它。 Joda-Time也提供其他方式。

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

DateTimeZone timeZone = DateTimeZone.forID( "Europe/London" );
DateTime dateTimeNew = new DateTime( timeZone );
DateTime dateTimeOld = dateTimeNew.minusHours( 2 );

Period period = new Period( dateTimeOld, dateTimeNew );

转储到控制台...

System.out.println( "dateTimeNew: " + dateTimeNew );
System.out.println( "dateTimeOld: " + dateTimeOld );
System.out.println( "period: " + period );

跑步时......

dateTimeNew: 2014-01-02T23:19:45.021Z
dateTimeOld: 2014-01-02T21:19:45.021Z
period: PT2H