有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用新日期(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

共 (4) 个答案

  1. # 1 楼答案

    设置实际时间后,我必须进行以下区分:

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

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

  2. # 2 楼答案

    根据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)); 
    
  3. # 3 楼答案

    罗伯特

    您的解决方案会起作用,但我认为这就像让一个工作区围绕另一个工作区,这会使您的代码更复杂,因此更难维护。为什么不将SimpleDataFormat用于此模式:

    "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

    问候

  4. # 4 楼答案

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

    如果希望使用的类自动更正夏令时,可以使用内置日历类或^a1}。我真的建议你看看乔达时间。它比java好。util。日期:爪哇。sql。日期和java。util。日历组合!处理一个真正完整的时间库比处理3个不同的时间库并尝试在它们之间转换要容易得多

    此外,作为一个有趣的旁白,它显示了DST有多么困难,请参见this video——在大约4分钟的时间里,它解释了不同国家如何实施DST,以及这给每个人带来了多大的头痛