有 Java 编程相关的问题?

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

Java中的日历时区

我正在用java开发一个安全签名,它还可以验证通话的日期和时间。POST call会带来类似的内容

String date = "Sat, 27 Apr 2013 01:11:30 GMT"
SimpleDateFormat RFC1123Format = new SimpleDateFormat("EEE, dd MMM yyyyy HH:mm:ss z", Locale.US);

我能解析它

Calendar gmtTime = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
Date dateHeader = RFC1123Format.parse(date);
gmtTime.setTime(dateHeader);

System.out.println("Date Header (GMT TIME): " + gmtTime.getTimeInMillis() + " ms");
System.out.println("Hour of day (GMT TIME): " + gmtTime.get(Calendar.HOUR_OF_DAY));

Calendar currentTime = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
currentTime.setTimeInMillis(System.currentTimeMillis());

System.out.println("System Date (LA TIME): " + currentTime.getTimeInMillis() + " ms");
System.out.println("Hour of day (LA TIME): " + currentTime.get(Calendar.HOUR_OF_DAY));

currentTime.setTimeZone(TimeZone.getTimeZone("GMT"));

System.out.println("System Date (GMT TIME): " + currentTime.getTimeInMillis() + " ms");
System.out.println("Hour of day (GMT TIME): " + currentTime.get(Calendar.HOUR_OF_DAY));

System.out.println("Diff: " + Math.abs(gmtTime.getTimeInMillis() - currentTime.getTimeInMillis()));

然而,我得到的打印结果却相差整整一个小时

Date Header (GMT TIME): 1367025090000 ms
Hour of day (GMT TIME): 1
System Date (LA TIME): 1367022298441 ms
Hour of day (LA TIME): 0
System Date (GMT TIME): 1367022298441 ms
Hour of day (GMT TIME): 0
Diff: 2791559

有什么想法吗


共 (2) 个答案

  1. # 2 楼答案

    通过添加额外的验证来检查是否遵守了夏令时,我自己修复了这个问题。这是最后的代码:

    Calendar gmtTime = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
    Date dateHeader = RFC1123Format.parse(date);
    gmtTime.setTime(dateHeader);
    
    Calendar currentTime = Calendar.getInstance();
    currentTime.setTimeInMillis(System.currentTimeMillis());
    boolean DST = false;
    if(currentTime.getTimeZone().inDaylightTime(currentTime.getTime())) {
        DST = true; 
    }
    currentTime.setTimeZone(TimeZone.getTimeZone("GMT"));
    if(DST) { 
        currentTime.set(Calendar.HOUR_OF_DAY, currentTime.get(Calendar.HOUR_OF_DAY) + 1); 
        .
        .
        .
        <code to handle last day of month and month change as a result of the hour adjustment>
    }
    

    感谢@gangqinlaohu的建议