使用新日期(aDate.getTime()+aTime)创建Java日期时忽略夏令时。getTime())
我目前正在验证生成的Excel工作表是否包含正确呈现的“时间戳”,其日期和时间部分位于单独的单元格中,其格式由区域设置调整
我的测试用例失败了,因为当我从字符串中读回Excel工作表的时间时,夏令时似乎被忽略了
以下是我的Java代码:
Date now = new Date();
// [... other code, creating and reading the Excel sheet etc. ...]
// from an Excel sheet
String dateString = cellB2.getStringCellValue(); // e.g., 3.7.2013
String timeString = cellB3.getStringCellValue(); // e.g., 13:38:09
TimeZone tz = TimeZone.getDefault(); // Berlin, CEST
dateFormat.setTimeZone(tz); // dateFormat is result of DateFormat.getDateInstance(DateFormat.MEDIUM, locale); e.g. with locale "cs_CZ"
timeFormat.setTimeZone(tz); // timeFormat is result of DateFormat.getTimeInstance(DateFormat.MEDIUM, locale); e.g. with locale "cs_CZ"
// try to parse the time / date strings using the expected format
Date actualDate = dateFormat.parse(dateString); // e.g., Wed Jul 03 00:00:00 CEST 2013
Date actualTime = timeFormat.parse(timeString); // e.g. Thu Jan 01 13:38:09 CET 1970
// now: e.g. Wed Jul 03 13:38:09 CEST 2013
// actualDateTime: e.g. Wed Jul 03 12:48:07 CEST 2013
Date actualDateTime = new Date(actualDate.getTime() + actualTime.getTime());
assertFalse(now.after(actualDateTime)); // fails
# 1 楼答案
设置实际时间后,我必须进行以下区分:
由于仅限时间的字符串将始终导致日期为1970年1月1日,因此不会考虑夏令时(至少我的柏林案例不会考虑夏令时),我必须手动进行调整
# 2 楼答案
根据Martin和Matt的建议,这里是我最后的程序片段:
# 3 楼答案
罗伯特
您的解决方案会起作用,但我认为这就像让一个工作区围绕另一个工作区,这会使您的代码更复杂,因此更难维护。为什么不将SimpleDataFormat用于此模式:
然后,制作一个日期字符串,如下所示:
然后你可以解析它。。。我并没有实际测试它,但它应该给你一个想法,也许你需要检查模式字符串,下面是参考:
http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html
问候
# 4 楼答案
java中的日期不会自动添加夏令时。这是因为java日期是按历元(1970年1月1日以来的秒数)计算的,表示UTC时间
如果希望使用的类自动更正夏令时,可以使用内置日历类或^a1}。我真的建议你看看乔达时间。它比java好。util。日期:爪哇。sql。日期和java。util。日历组合!处理一个真正完整的时间库比处理3个不同的时间库并尝试在它们之间转换要容易得多
此外,作为一个有趣的旁白,它显示了DST有多么困难,请参见this video——在大约4分钟的时间里,它解释了不同国家如何实施DST,以及这给每个人带来了多大的头痛