我们在应用程序中使用固定的时间段。当用户添加一个新的时段时,默认应该是从早上 6:00 到第二天早上 6:00。
通常是 24 小时,但有一个问题:当执行夏令时更改时,该时间段的长度会发生变化。例如 :
10 月 27 日上午 6 点至 10 月 28 日上午 6 点。在此期间执行从 CEST 到 CET 时区的转换。因此,此期间包含 25 小时:
From 27 October 6:00 AM to 28 October 3:00 AM - there are 21 hours
at 3:00 am the time is shifted back by 1 hour, so there are 4 hours until 28 October 6:00 AM.
我们遇到了这个问题,试图写一个单元测试来防止它再次出现。测试在我们的机器上成功通过,但在 CI 服务器上失败(它在另一个时区)。
问题是:我们如何能够独立于机器的时区设计我们的单元测试?
目前,小时跨度的计算是使用Joda-Time计算的:
if ((aStartDate == null) || (aEndDate == null)) {
return 0;
}
final DateTime startDate = new DateTime(aStartDate);
final DateTime endDate = new DateTime(aEndDate);
return Hours.hoursBetween(startDate, endDate).getHours();
在我们这边通过但在 CI 服务器上失败的单元测试:
Calendar calendar = Calendar.getInstance();
calendar.set(2012, Calendar.OCTOBER, 27, 6, 0);
startDate= calendar.getTime();
calendar.set(2012, Calendar.OCTOBER, 28, 6, 0);
endDate= calendar.getTime();
我们尝试对日历使用时区:
TimeZone.setDefault(TimeZone.getTimeZone(TimeZone.getTimeZone("GMT").getID()));
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(TimeZone.getTimeZone("GMT").getID()));
calendar.set(2012, Calendar.OCTOBER, 27, 6, 0, 0);
startDate= calendar.getTime();
calendar.set(2012, Calendar.OCTOBER, 28, 6, 0, 0);
endDate= calendar.getTime();
但在这种情况下,结果 startDate 是 CEST 10 月 27 日 9:00,endDate 是 CET 10 月 28 日 8:00,所以即使在我们这边测试也失败了。
先感谢您。