我正在研究java中的一個安全簽名,該簽名還驗證了調用的日期和時間。該POST呼叫到達的東西,如Java中的時區
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()));
然而,我打印了1小時整得不同。
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
任何想法?
夏令時? – Justin 2013-04-27 00:30:12
是的,但我怎麼解釋這個......?我如何驗證DST是否被遵守?? – avillagomez 2013-04-27 00:38:27
Java日期/時間API包含了Olson時區數據庫,並且能夠提供從UTC到本地時間的歷史準確轉換,即使考慮到DST。如果您正在從UTC進行映射並獲得意外結果,則很可能是因爲您正在對不同的時區進行意外更正。就你而言,它似乎是你的日曆設置爲UTC。 Java Date對象始終在內部使用UTC。但是,您的格式化程序未提供日曆,因此正在使用您的系統默認時區規則。嘗試將您的格式化器設置爲您的UTC日曆。 – scottb 2013-04-27 02:28:09