我们在应用程序中使用固定时间段。当用户添加一个新的时间段时,应默认从第二天上午6:00到上午6:00。Joda-Time,夏令时计算,时区独立测试
通常情况下,这是24小时,但有一个问题:执行夏令时更改时,该时段的长度会发生变化。例如:
10月27日6:00 AM至10月28日6:00 AM。在此期间执行从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 10月27日9:00 CEST和10月28日8:00 CET结束日期,所以即使在我们这边,测试也失败了。
预先感谢您。
什么是'aStartDate'和'aEndDate'?目前还不清楚你试图获得什么结果,或者你希望使用哪个时区(因为你曾经在一个地方谈过CST/CEST,另一个地方是GMT)。你期望它有什么作用:'TimeZone.getTimeZone(TimeZone.getTimeZone(“GMT”).getID())'? –
@JonSkeet关于示例代码 - 我只是试图得到任何结果,所以现在对我来说没什么意义。关于预期结果 - 我们希望确保在有DST转换时 - 根据用户的时区,1“天”的长度为23或25小时。 – StKiller