web-dev-qa-db-ja.com

2010年12月31日が週として1を返すのはなぜですか?

例えば:

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

城田時間でも同じことが起こります。

:)

28
OscarRyz

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.週に属します。

53
Ralph

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

その週が2010年の最後の週なのか2011年の最初の週なのかを判断するにはJavaはgetMinimalDaysInFirstWeekjavadoc を使用します。そのメソッドが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
9
Adam

IIRC、1月1日の日付の最初の週は第1週です。
そのため、2010年12月31日に第1週が返されます。
2011年12月31日に試してみると、52が得られます。

編集:週はロケール固有であり、日曜日-土曜日として定義されることもあれば、月曜日-日曜日として定義されることもあります

3
KevinDTimm

これは、週の始まりが地域に依存しているためです。

米国では、第1週は1月1日より前の日曜日に始まります。2010年は12月26日です。そのため、12月31日はまだ第1週です。

ヨーロッパでは、第1週は1月1日より前の月曜日に始まります。2010年は12月27日です。そのため、ヨーロッパでも12月31日はまだ第1週です。

2
anon

これはより良いアプローチだと思います。

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のカレンダーに実装されていないのかを提案してください。

0
Tanny