3

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

4 回答 4

2

罗伯特,

您的解决方案将起作用,但我认为这就像围绕另一种解决方法制定一种解决方法,它会使您的代码更复杂,因此更难维护。为什么不将 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

问候

于 2013-07-03T14:44:25.910 回答
1

遵循 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)); 
于 2013-07-03T15:06:09.740 回答
0

在设置actualTime之后,我必须做出以下区分:

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

由于仅时间字符串将始终导致日期为 1970 年 1 月 1 日,因此永远不会考虑夏令时(至少对于我的柏林案例而言),我必须手动进行调整。

于 2013-07-03T14:27:42.280 回答
0

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

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

此外,作为一个有趣的旁白,它显示了 DST 的难度,请看这个视频- 在大约 4 分钟的时间里,它解释了不同的国家如何实施 DST 以及这给每个人带来的头痛。

于 2013-07-03T15:08:11.103 回答