2013-04-27 30 views
0

我正在研究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 

任何想法?

+1

夏令時? – Justin 2013-04-27 00:30:12

+0

是的,但我怎麼解釋這個......?我如何驗證DST是否被遵守?? – avillagomez 2013-04-27 00:38:27

+0

Java日期/時間API包含了Olson時區數據庫,並且能夠提供從UTC到本地時間的歷史準確轉換,即使考慮到DST。如果您正在從UTC進行映射並獲得意外結果,則很可能是因爲您正在對不同的時區進行意外更正。就你而言,它似乎是你的日曆設置爲UTC。 Java Date對象始終在內部使用UTC。但是,您的格式化程序未提供日曆,因此正在使用您的系統默認時區規則。嘗試將您的格式化器設置爲您的UTC日曆。 – scottb 2013-04-27 02:28:09

回答

0

固定它自己。這是最終的代碼:

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您的建議。

1

您可以使用JodaTime >>http://joda-time.sourceforge.net/,通過增加一個額外的驗證,以檢查是否正在觀察夏令更有效地實現TimeZone的計算比Java日曆

+0

我與喬達時間合作解決了夏令時問題,但最終它給出了同樣的問題。這是由於pc(或服務器)時區配置。 – 2013-04-27 00:50:20

0

您不給格式化程序用於表示您的時間戳的日曆。

在這種情況下,您的日曆設置爲以GMT格式表示時間戳。 GMT是UTC的同義詞,UTC從未觀察到對DST的任何調整。但是,默認情況下,您的格式化程序必須將系統默認日曆中提供的字符串轉換爲基礎,這可能確實遵守DST。

如果是這種情況,可以通過確保格式器使用與您用來表示日期/時間的日曆相同的日曆來獲得一致的報告。試試這個:

SimpleDateFormat RFC1123Format = new SimpleDateFormat(); 
GregorianCalendar gc - new GregorianCalendar(TimeZone.getTimeZone("GMT")); 

RFC1123Format.setCalendar(gc); 
RFC1123Format.applyPattern("EEE, dd MMM yyyyy HH:mm:ss z"); 

gc.setTime(RFC1123Format.parse(yourDateString));