1

年の特定の週番号の月曜日を計算したい。これは私がそれを行う方法です:

final GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY);
calendar.clear();
calendar.set(Calendar.YEAR, 2012); // set to 2012
calendar.set(Calendar.WEEK_OF_YEAR, 20); // set to week number 20
calendar.setTimeZone(TimeZone.getTimeZone("Europe/Berlin")); // set time zone

SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yy"); // german format
System.out.println(sdf.format(calendar.getTime())); // return date

これは 2012 年 5 月 14 日 (ドイツ語の形式では 14.05.12) を返さなければなりませんが、2012 年 5 月 16 日を返しますが、これは間違っています。

したがって、2012 年の場合は +2、2011 年は正しく、2010 年は -1 です。

GregorianCalendar が間違った日付を計算するのはなぜですか?

ドイツからよろしくお願いします。

4

2 に答える 2

2

これは、getFirstDayOfWeek()が何を返すか、および1月1日が何日に当たるかによって異なります。

Javadocから:

WEEK_OF_YEARフィールドに対して計算される値の範囲は1〜53です。1年の第1週は、その年から少なくともgetMinimalDaysInFirstWeek()日を含むgetFirstDayOfWeek()から始まる最も早い7日間です。したがって、getMinimalDaysInFirstWeek()、getFirstDayOfWeek()の値、および1月1日の曜日に依存します。ある年の第1週から翌年の第1週までの週には、2から52または53まで順番に番号が付けられます(必要)。

たとえば、1998年1月1日は木曜日でした。getFirstDayOfWeek()がMONDAYで、getMinimalDaysInFirstWeek()が4の場合(これらはISO 8601と多くの国内標準を反映する値です)、1998年の第1週は、1997年12月29日に始まり、1998年1月4日に終わります。 getFirstDayOfWeek()がSUNDAYの場合、1998年の第1週は1998年1月4日に始まり、1998年1月10日に終わります。1998年の最初の3日間は、1997年の第53週の一部です。

于 2011-08-25T11:51:31.747 に答える
1

も設定してみてくださいDAY_OF_WEEK

final GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY);
calendar.clear();
calendar.set(Calendar.YEAR, 2012); // set to 2012
calendar.set(Calendar.WEEK_OF_YEAR, 20); // set to week number 20
calendar.set( Calendar.DAY_OF_WEEK, Calendar.MONDAY ); //set day to monday
calendar.setTimeZone(TimeZone.getTimeZone("Europe/Berlin")); // set time zone

SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yy"); // german format
System.out.println(sdf.format(calendar.getTime())); // return date

私には 14.05.12、16.05.11、17.05.10 が返されます。

編集:

したがって、2012 年の場合は +2、2011 年は正しく、2010 年は -1 です。

私の理解が正しければ、16.05.10、16.05.11、16.05.12 になりますね。これは、カレンダーの一部が再利用されていることを示しています。ひょっとして、2011年から連続でテストしたんですか?その場合、年のみを変更せずに変更するclear()と、以前に計算された日付が保持されます。

于 2011-08-25T11:49:25.803 に答える