2013年11月6日水曜日

[Android]Calendarクラスのバグ?

注)比較的難易度高めの記事です。
Android APIのバグの可能性もあるので、もしそうでしたら、報告する場所教えてください><
(何か賞金とかもらえるなら折半で!)

Calendar使う場合、こういうことをする時があります。

DAY_OF_WEEK  
はcalendar オブジェクトが何曜日かというのを指定します。

WEEK_OF_YEAR
は calendar オブジェクトが一年の何週目(最大52週)というのを指定します。

この2つで、特定の日付を解決します。

(本当は YEAR (年)も設定する必要はありそうですが、なぜかAndroidでは必須ではない。)

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
calendar.set(Calendar.WEEK_OF_YEAR, 30);
Log.d("tag", calendar.get(Calendar.WEEK_OF_YEAR) + "");

一旦 オブジェクトが日曜日 というのを設定します。
さらにcalendar オブジェクトが一年の30週目というのを設定します。
つまり 2013年7月21日というのを設定しています。
なので、ここでは30が出力されます。
しかし、

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.WEEK_OF_YEAR, 30);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
Log.d("tag", calendar.get(Calendar.WEEK_OF_YEAR) + "");

と書いたら、なぜかWEEK_OF_YEARが反映されずに、
今週(2013年11月6日現在なら45)
が出力されてしまいます。

時間があったら、この問題を追ってみたいと思います。

ちなみに通常の Java(Java 7)ではこの問題は発生しないっぽいです。

参考:

Java API

http://docs.oracle.com/javase/jp/1.5.0/api/java/util/Calendar.html


Android API

http://developer.android.com/reference/java/util/Calendar.html