使用新日期(aDate.getTime()+aTime.getTime)创建Java日期时忽略夏令时



我目前正在验证生成的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

Robert,

您的解决方案会起作用,但我认为这就像是围绕另一个解决方案制定一个变通方案,这会使您的代码更加复杂,因此更难维护。为什么不使用具有以下模式的SimpleDateFormat:

"dd.MM.YYYY kk:mm:ss"

然后,只需制作这样的日期字符串:

String dateTime = cellB2.getStringCellValue() + " " + cellB3.getStringCellValue();

然后你可以解析它……我实际上并没有测试它,但它应该给你一个想法,也许你需要检查模式字符串,这里是参考:

http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html

问候

根据Martin和Matt的建议,下面是我的最后一个程序片段:

    // from an Excel sheet
    String dateString = cellB2.getStringCellValue();
    String timeString = cellB3.getStringCellValue();
    TimeZone tz = TimeZone.getDefault(); 
    // NEW!
    DateFormat dateTimeFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, l); 
    dateTimeFormat.setTimeZone(tz);
    Date actualDateTime = dateTimeFormat.parse(dateString + " " + timeString);
    assertFalse(now.after(actualDateTime)); 

设置actualTime后,我必须进行以下区分:

    if (tz.inDaylightTime(actualDate)) {
        actualTime = new Date(actualTime.getTime() + 1000 * 60 * 60);
    }

由于只有时间的字符串总是会导致日期为1970年1月1日,因此永远不会考虑夏令时(至少在我的柏林案例中不会),我必须手动进行调整。

java中的日期不会自动添加夏令时。这是因为java日期是按epoch(自1970年1月1日以来的秒数)计算的,表示UTC时间。

如果您希望使用的类自动更正夏令时,您可以使用内置的Calendar类或Joda time。我真的建议你去看一下Joda Time。它比java.util.Date java.sql.Date和java.util.Calendar加在一起要好!处理一个真正完整的时间库要比处理三个不同的时间库并尝试在它们之间转换容易得多。

此外,有趣的一点是,夏令时有多困难,请看这段视频——大约在4分钟的时候,它解释了不同国家是如何实施夏令时的,以及这给每个人带来了多大的头痛。

相关内容

  • 没有找到相关文章

最新更新