こんにちは。「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も上記と同じように例外をスローするようになってますが、値が返却されてます。
それにしても、ロケールとタイムゾーンを独立して設定する状況はあるのでしょうか。