例えば:
Calendar c = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
out.println( c.get( Calendar.WEEK_OF_YEAR ) );
プリント1
城田時間でも同じことが起こります。
:)
Week of Yearの定義は Locale
に依存します。
それが米国でどのように定義されているかは、他の投稿で議論されています。たとえば、ドイツでは( DIN 1355-1 / ISO 8601 ):年の最初の週*は、新年が4日以上ある最初の週です。
*最初の曜日は月曜日、最後の曜日は日曜日
そして、JavaのCalendar
はロケールに注意を払います。例えば:
public static void main(String[] args) throws ParseException {
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date lastDec2010 = sdf.parse("31/12/2010");
Calendar calUs = Calendar.getInstance(Locale.US);
calUs.setTime(lastDec2010);
Calendar calDe = Calendar.getInstance(Locale.GERMAN);
calDe.setTime(lastDec2010);
System.out.println( "us: " + calUs.get( Calendar.WEEK_OF_YEAR ) );
System.out.println( "de: " + calDe.get( Calendar.WEEK_OF_YEAR ) );
}
プリント:
us: 1
de: 52
[〜#〜]追加[〜#〜]米国の場合(そしてメキシコでも同じだと思います)1週of Yearは、1月1日が属する週です。 -したがって、1。Januarが土曜日の場合、前の金曜日(12月31日)は同じ週に属し、この場合、この日は2011年の1.週に属します。
WEEK_OF_YEARフィールドに対して計算された値の範囲は1〜53です。1年の第1週は、その年から少なくともgetMinimalDaysInFirstWeek()日を含むgetFirstDayOfWeek()から始まる最も早い7日間です。したがって、getMinimalDaysInFirstWeek()、getFirstDayOfWeek()の値、および1月1日の曜日によって異なります。1年の第1週から翌年の第1週までの週には、2から52または53まで順番に番号が付けられます(必要)。
その週が2010年の最後の週なのか2011年の最初の週なのかを判断するにはJavaはgetMinimalDaysInFirstWeek
javadoc を使用します。そのメソッドが7を返す場合、最初の週のすべての日が同じ年である週は第1週であり、1を返すと、翌年の任意の曜日の最初の週が翌年の第1週になります。
この場合、2011年1月の第1週は土曜日であるため、1日の週がすでに翌年の第1週と見なされるようにしたい場合は、2011年の第1週と見なされます。次に行います:
Calendar c = Calendar.getInstance();
c.setMinimalDaysInFirstWeek(7);//anything more than 1 will work in this year
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
System.out.println( c.get( Calendar.WEEK_OF_YEAR ) );
戻り値:
52
IIRC、1月1日の日付の最初の週は第1週です。
そのため、2010年12月31日に第1週が返されます。
2011年12月31日に試してみると、52が得られます。
編集:週はロケール固有であり、日曜日-土曜日として定義されることもあれば、月曜日-日曜日として定義されることもあります
これは、週の始まりが地域に依存しているためです。
米国では、第1週は1月1日より前の日曜日に始まります。2010年は12月26日です。そのため、12月31日はまだ第1週です。
ヨーロッパでは、第1週は1月1日より前の月曜日に始まります。2010年は12月27日です。そのため、ヨーロッパでも12月31日はまだ第1週です。
これはより良いアプローチだと思います。
Calendar c = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
int thisWeek = c.get(Calendar.WEEK_OF_YEAR);
if (c.get(Calendar.MONTH) == Calendar.DECEMBER && thisWeek == 1)
thisWeek = 53;
System.out.println(thisWeek);
ここでの主な仮定は、12月の場合、週を1にすることはできないため、53を返すだけです。
私がどこかで間違っている場合、そしてなぜこれがJavaのカレンダーに実装されていないのかを提案してください。