当前位置: 首页 > 知识库问答 >
问题:

使用new Date(aDate.getTime()aTime.getTime()创建JavaDate时忽略夏令时

蓬高谊
2023-03-14

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

共有3个答案

澹台硕
2023-03-14

在设置了实际时间之后,我要做以下区分:

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

由于仅限时间的字符串总是会导致日期为1970年1月1日,所以不会考虑夏令时(至少我的柏林案例不会考虑夏令时),我必须手动进行调整。

魏宏邈
2023-03-14

根据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)); 
乔凯康
2023-03-14

罗伯特,

你的解决方案会奏效,但我认为这就像是让一个解决方案绕过另一个解决方案,这会让你的代码更复杂,因此更难维护。为什么不将SimpleDataFormat用于此模式:

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

然后,制作一个日期字符串,如下所示:

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

然后你可以解析它...我实际上没有测试它,但它应该会给你这个想法,也许你需要检查模式String,这是参考:

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

当做

 类似资料:
  • 轻触方格启用设定,即可将夏令时反映于时间显示中。

  • 问题内容: 如何检查夏令时是否有效? 问题答案: 您可以使用并查看返回值中的标志。 使用,您可以在任意时间问相同的问题,以了解DST在当前时区是否有效。

  • 夏令时间 选择[标准]或[夏令时间]。

  • 有什么办法能做到这一点吗? 谢谢!

  • Liquibase版本:3.3.2 DB平台:SQL服务器2014 驱动程序:jdbc 4.0 我使用GenerateChangeLog命令从我的数据库生成一组新的部署脚本。许多表都没有NULL列,但当我测试Liquibase部署(更新)列时,它们都可以为空。这导致PK创建失败。 样本更改集: 有什么建议吗?

  • 问题内容: 我正在编写一个处理很多时区并跨越时区的程序。我最常处理的两件事是从“ now”创建一个datetime对象,然后本地化一个朴素的datetime对象。 要从现在开始在太平洋时区创建datetime对象,我目前正在执行此操作(python 2.7.2+) 关于DST,这是否正确?如果没有,我想应该这样做: 我的问题是为什么?谁能告诉我第一个错误而第二个秒正确的情况? 至于我的秒数问题,假