0

私は、呼び出しが行われた日時も検証する Java のセキュリティ署名に取り組んでいます。POST呼び出しは次のようなもので到着します

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

何か案は?

4

3 に答える 3

1

Java カレンダーよりも効率的に TimeZone 計算を実装する JodaTime >> http://joda-time.sourceforge.net/を使用できます。

于 2013-04-27T00:38:55.070 に答える
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));
于 2013-04-27T01:02:07.123 に答える
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。

于 2013-04-27T00:55:23.697 に答える