java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

Calendarクラスのインスタンス

投稿日:

最終更新日:2016年07月09日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

今回は突然Calendarクラスが気になり、Calendar#getInstanceをロケールとタイムゾーンを設定してgeXXXメソッドで取得できる値を出力してみましたが、結局よくわからなかったという話を書きます。使ったgetXXXメソッドは引数なしのメソッドです。

今回使ったgetInstanceメソッドは次の2つです。

  • static Calendar getInstance(Locale aLocale)
  • static Calendar getInstance(TimeZone zone)

他に getInstance()と getInstance(TimeZone zone, Locale aLocale)がありますが今回は使いませんでした。ロケールの方はLocaleクラスにクラス変数が用意されていたのでそれを使いました。TimeZoneは文字列を指定するしかないらしいのですが、TimeZone#getAvailableIDsメソッドを使うと使える文字列全てが取得できます。

プログラム

以下、今回使ったソースと実行結果です。

ソース

package calendarTest;

import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;

public class HelloGetInstance {

    public static void main(String[] args) {

        System.out.println("Locale.FRANCE");
        showData(Calendar.getInstance(Locale.FRANCE));
        System.out.println();

        System.out.println("Locale.JAPAN");
        showData(Calendar.getInstance(Locale.JAPAN));
        System.out.println();

        System.out.println("タイムゾーン: Europe/London");
        showData(Calendar.getInstance(TimeZone.getTimeZone("Europe/London")));
        System.out.println();

        System.out.println("タイムゾーン: Japan");
        showData(Calendar.getInstance(TimeZone.getTimeZone("Japan")));
        System.out.println();

    }

    private static void showData(Calendar c) {
        System.out.println("getCalendarType: " + c.getCalendarType());
        System.out.println("getFirstDayOfWeek: " + c.getFirstDayOfWeek());
        System.out.println("getMinimalDaysInFirstWeek: " + c.getMinimalDaysInFirstWeek());
        System.out.println("getTime: " + c.getTime());
        System.out.println("getTimeInMillis: " + c.getTimeInMillis());
        System.out.println("getTimeZone: " + c.getTimeZone());
        System.out.println("getWeeksInWeekYear: " + c.getWeeksInWeekYear());
        System.out.println("getWeekYear:" + c.getWeekYear());
    }

}

結果

Locale.FRANCE
getCalendarType: gregory
getFirstDayOfWeek: 2
getMinimalDaysInFirstWeek: 4
getTime: Sat Jul 09 15:04:54 JST 2016
getTimeInMillis: 1468044294149
getTimeZone: sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
getWeeksInWeekYear: 52
getWeekYear:2016

Locale.JAPAN
getCalendarType: gregory
getFirstDayOfWeek: 1
getMinimalDaysInFirstWeek: 1
getTime: Sat Jul 09 15:04:54 JST 2016
getTimeInMillis: 1468044294245
getTimeZone: sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
getWeeksInWeekYear: 53
getWeekYear:2016

タイムゾーン: Europe/London
getCalendarType: gregory
getFirstDayOfWeek: 1
getMinimalDaysInFirstWeek: 1
getTime: Sat Jul 09 15:04:54 JST 2016
getTimeInMillis: 1468044294251
getTimeZone: sun.util.calendar.ZoneInfo[id="Europe/London",offset=0,dstSavings=3600000,useDaylight=true,transitions=242,lastRule=java.util.SimpleTimeZone[id=Europe/London,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]]
getWeeksInWeekYear: 53
getWeekYear:2016

タイムゾーン: Japan
getCalendarType: gregory
getFirstDayOfWeek: 1
getMinimalDaysInFirstWeek: 1
getTime: Sat Jul 09 15:04:54 JST 2016
getTimeInMillis: 1468044294253
getTimeZone: sun.util.calendar.ZoneInfo[id="Japan",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
getWeeksInWeekYear: 53
getWeekYear:2016

感想

以下、なんとなく感想を書いていきます。

getCalendarTypeはクラス名を返却しているだけのようです。gregoryが返却されます。

getFirstDayOfWeekは「週の最初の曜日が何であるかを」を取得するようで、クラス変数のfirstDayOfWeekが返却されます。「Locale.FRANCE」の場合は「2」という数字が取得できました。Calendarクラスをソースを見ると定数が定義されていて、SUNDAYが「1」、MONDAYが「2」です。なのでLocale.FRANCEでは週の最初が月曜日。

getMinimalDaysInFirstWeekはクラス変数minimalDaysInFirstWeekを返却します。API仕様書によると「年の最初の週に必要な最小日数」を表すようなのですが、よくわかりませんでした。Locale.FRANCEでは「4」が返却されてます。

getTimeは時間が取得できます。ロケールやタイムゾーンによらないようです。ソース見たら「return new Date(getTimeInMillis())」と書いてありました。なので設定によらないようです。

getTimeInMillisは1970年1月1日からのミリ秒を返却します。設定によらないようです。

getTimeZoneはタイムゾーンを返却します。ロケールの設定とは独立しているように見えます。Locale.FRANCEでもタイムゾーンがAsia/Tokyoという状態です。タイムゾーンをEurope/Londonに設定した場合、内容が長くなってます。

getWeeksInWeekYearはAPI仕様書の説明を見てもわかりませんでした。Calendarクラスのソースを見ると「throw new UnsupportedOperationException()」とあります。例外をスローするようですが、なぜか値が返却されてます。

getWeekYearも上記と同じように例外をスローするようになってますが、値が返却されてます。

それにしても、ロケールとタイムゾーンを独立して設定する状況はあるのでしょうか。