私はこの質問に非常に遅れていますが、完全な答えが欠けていると感じています。つまり、週の解釈方法は、によって大きく異なる可能性がありますLocale
。
質問には、米国(または同様のLocale
)の設定が必要なようです。これは、最初の週の最小日数として1を使用し、週の最初の日として日曜日を使用します。
質問とすべての回答はCalendar
、最初の週の最小日数が4日、週の最初の日が月曜日であるデフォルトのインスタンスを取ります。
簡単なデモプログラムはこれを示しています:
public static void main(String[] args) {
{
System.out.println("--- ISO ---");
Calendar calendar = Calendar.getInstance();
System.out.println("First day of week : " + calendar.getFirstDayOfWeek());
System.out.println("Minimal days in 1st week : " + calendar.getMinimalDaysInFirstWeek());
calendar.set(2012, Calendar.SEPTEMBER, 20);
int wk = calendar.get(Calendar.WEEK_OF_MONTH);
System.out.println("Week of Month : " + wk);
}
{
System.out.println("--- USA ---");
Calendar calendar = Calendar.getInstance(Locale.US);
System.out.println("First day of week : " + calendar.getFirstDayOfWeek());
System.out.println("Minimal days in 1st week : " + calendar.getMinimalDaysInFirstWeek());
calendar.set(2012, Calendar.SEPTEMBER, 20);
int wk = calendar.get(Calendar.WEEK_OF_MONTH);
System.out.println("Week of Month : " + wk);
}
}
そして、それはこの出力をもたらします:
--- ISO ---
First day of week : 2
Minimal days in 1st week : 4
Week of Month : 3
--- USA ---
First day of week : 1
Minimal days in 1st week : 1
Week of Month : 4
結論:
最初の週または最初の曜日の最小日数を手動で設定する必要はありません。正しいものを使用していることを確認してくださいLocale
。
追加
Jodaの時間はISO週間しかサポートしていませんでした。Java 8と新しいtimeAPI以降、次のように実行できます。
LocalDate localDate = LocalDate.of(2012, 9, 20);
TemporalField usWeekOfMonth = WeekFields.of(Locale.US).weekOfMonth();
TemporalField isoWeekOfMonth = WeekFields.ISO.weekOfMonth();
System.out.println("USA week of month " + usWeekOfMonth.getFrom(localDate));
System.out.println("ISO week of month " + usWeekOfMonth.getFrom(localDate));
出力:
USA week of month 4
ISO week of month 4
そして、フォーマッターにもサポートがあります:
DateTimeFormatter usDateTimeFormatter = DateTimeFormatter.ofPattern("W/MM")
.withLocale(Locale.US);
System.out.println("USA formatter : " + usDateTimeFormatter.format(localDate));
DateTimeFormatter isoDateTimeFormatter = DateTimeFormatter.ofPattern("W/MM");
System.out.println("ISO formatter : " + isoDateTimeFormatter.format(localDate));
出力:
USA formatter : 4/09
ISO formatter : 3/09