2010-12-28 17 views
4

今年の週に問題があります。私のマシンでJDK 1.6.0.22のバージョンが別のマシン1.6.0.21にインストールされています。両方のマシンが異なる結果を返す:Javaカレンダーの問題、JDK 1.6.0.22

(1.6.0.22)週:1
(1.6.0.21)週である:このコード52

 try { 
     Calendar current = new GregorianCalendar(); 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
     Date d = df.parse("2010-12-28 19:04:38 GMT"); 
     current.setTime(d); 
     int currentWeek = current.get(Calendar.WEEK_OF_YEAR); 
     System.out.println("week is: "currentWeek); 
     } catch (ParseException e) { 
     e.printStackTrace(); 
     } 

なぜJDK 1.6.0.22が間違った結果を出すのですか?この差が発生する可能性がありますなぜ

答えて

9

この抜粋from the API documentationは説明する:

年の1から53までWEEK_OF_YEAR フィールドの範囲週1に対して計算値は、getFirstDayOfWeekに始まる早い7日間 です() には、その年の から少なくとも getMinimalDaysInFirstWeek()日が含まれています。したがって

そしてCalendarのソースコードから1月1日の週ge​​tMinimalDaysInFirstWeek()、 getFirstDayOfWeek()の 値に依存し、 の日:

両方をfirstDayOfWeekとminimalDaysInFirstWeekはロケールに依存します。

タイムゾーンではなく、これを決定するロケールです。明らかに、一部の地域では、1年の1週が前年に開始されると見なされます。これを実行してみましょう:

Calendar cal = new GregorianCalendar(); 
    System.out.println(Locale.getDefault()); 
    System.out.println(cal.getMinimalDaysInFirstWeek()); 
    System.out.println(cal.getFirstDayOfWeek()); 

私はどちらかあなたが異なるロケール、またはこれらのバージョン間で変更されたロケールデータ内の異なるバージョンを実行していることを賭けます。結果 "1"は、ロケールデータのバグ修正により、より正確な結果になることさえあります。

+0

例:Locale.US:第1週、Locale.GERMANY:第52週。ドイツの週は月曜日に開始し、日曜日は米国で開始します。 –

+0

権利。しかし、これについて例を挙げて説明してください。 'Locale.setDefault(Locale.US);カレンダーカレンダー= Calendar.getInstance(TimeZone.getTimeZone( "GMT")); calendar.setTime(new SimpleDateFormat( "yyyyMMdd")。parse( "20101226")); System.out.println(calendar.get(Calendar.WEEK_OF_YEAR)); // 1 calendar.setTimeZone(TimeZone.getTimeZone( "AST")); System.out.println(calendar.get(Calendar.WEEK_OF_YEAR)); // 52' – BalusC

+0

これはISと同じではないと信じています)8601規格では、「今週の01週は今年の木曜日の最初の週です。これは含まれている週に相当します言い換えれば、新年の最初の週は、新年の大半を占める週です。 " –

1

JDKの日付/時刻クラスを使用しないでください。代わりにJODA Timeを使用してください。

関連する問題