Mar 31, 2006

[Mustang] JapaneseImperialCalendar にチャレンジ

Mustang では遂に和暦がサポートされるらしい!!

JavaWorld 2006/05
を貰ったので何となく眺めていたら、とある記事で紹介されていた。 java.util.Calendar の実装クラスがパッケージプライベートなので API Document を眺めていても全く気付いていなかった。 Calendar の和暦サポートは Mustang でも流れたとばかり思っていた。 JavaWorld は久しぶりに開いたけれど、軽くでも毎月目を通すべきかもしれないな。

JavaWorld の記事中でも紹介されていた JapaneseImperialCalendar の紹介ページは↓

Java SE 6 Mustang じゃじゃ馬ならし 官公庁向けでも大丈夫 - 和暦
http://www.javainthebox.net/laboratory/JavaSE6/imperialcalendar/imperialcalendar.html

サンプルコード

package jp.in_vitro.codelets.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class Codelet {

    private Date date = new Date(System.currentTimeMillis());

    public Codelet() {
        super();
    }

    public static void main(final String[] args) {
        Codelet me = new Codelet();
        me.execute00();
        me.execute01();
        me.execute02();
        me.execute03();
    }

    protected void execute00() {
        Locale locale = new Locale("ja", "JP");
        Calendar cal = Calendar.getInstance(locale);

        System.out
                .println("0*************************************************************");

        System.out.println("Default Locale : " + Locale.getDefault());
        System.out.println("Calendar#getInstance : " + locale);
        System.out.println();
        System.out.println("" + cal);
        DateFormat format0 = new SimpleDateFormat("GGGGyy年MMMMdd日");
        System.out.println("GGGGyy年MMMMdd日 : " + format0.format(this.date));
        DateFormat format1 = new SimpleDateFormat("GGGyy年MMMMdd日");
        System.out.println("GGGyy年MMMMdd日 : " + format1.format(this.date));
        DateFormat format2 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGGyy/MM/dd : " + format2.format(this.date));
        DateFormat format3 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGyy/MM/dd : " + format3.format(this.date));
        System.out.println();
    }

    protected void execute01() {
        Locale locale = new Locale("ja", "JP", "JP");
        Calendar cal = Calendar.getInstance(locale);

        System.out
                .println("1*************************************************************");

        System.out.println("Default Locale : " + Locale.getDefault());
        System.out.println("Calendar#getInstance : " + locale);
        System.out.println();
        System.out.println("" + cal);
        DateFormat format0 = new SimpleDateFormat("GGGGyy年MMMMdd日");
        System.out.println("GGGGyy年MMMMdd日 : " + format0.format(this.date));
        DateFormat format1 = new SimpleDateFormat("GGGyy年MMMMdd日");
        System.out.println("GGGyy年MMMMdd日 : " + format1.format(this.date));
        DateFormat format2 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGGyy/MM/dd : " + format2.format(this.date));
        DateFormat format3 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGyy/MM/dd : " + format3.format(this.date));
        System.out.println();
    }

    protected void execute02() {
        Locale.setDefault(new Locale("ja", "JP"));
        Calendar cal = Calendar.getInstance();

        System.out
                .println("2*************************************************************");

        System.out.println("Default Locale : " + Locale.getDefault());
        System.out.println("Calendar#getInstance : null");
        System.out.println();
        System.out.println("" + cal);
        DateFormat format0 = new SimpleDateFormat("GGGGyy年MMMMdd日");
        System.out.println("GGGGyy年MMMMdd日 : " + format0.format(this.date));
        DateFormat format1 = new SimpleDateFormat("GGGyy年MMMMdd日");
        System.out.println("GGGyy年MMMMdd日 : " + format1.format(this.date));
        DateFormat format2 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGGyy/MM/dd : " + format2.format(this.date));
        DateFormat format3 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGyy/MM/dd : " + format3.format(this.date));
        System.out.println();
    }

    protected void execute03() {
        Locale.setDefault(new Locale("ja", "JP", "JP"));
        Calendar cal = Calendar.getInstance();

        System.out
                .println("3*************************************************************");

        System.out.println("Default Locale : " + Locale.getDefault());
        System.out.println("Calendar#getInstance : null");
        System.out.println();
        System.out.println("" + cal);
        DateFormat format0 = new SimpleDateFormat("GGGGyy年MMMMdd日");
        System.out.println("GGGGyy年MMMMdd日 : " + format0.format(this.date));
        DateFormat format1 = new SimpleDateFormat("GGGyy年MMMMdd日");
        System.out.println("GGGyy年MMMMdd日 : " + format1.format(this.date));
        DateFormat format2 = new SimpleDateFormat("GGGGyy/MM/dd");
        System.out.println("GGGGyy/MM/dd : " + format2.format(this.date));
        DateFormat format3 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGyy/MM/dd : " + format3.format(this.date));
        System.out.println();
    }
}

実行結果

0, 2, 3 の結果は理解できる。 1 は何故こうなるのだろう?? バグなのか仕様なのか・・・。 Mustang が正式にリリースされたら試してみるか。

0*************************************************************
Default Locale : ja_JP
Calendar#getInstance : ja_JP

java.util.GregorianCalendar[time=1143914626604,areFieldsSet=true,areAllFieldsSet
=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=324000
00,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1
,minimalDaysInFirstWeek=1,ERA=1,YEAR=2006,MONTH=3,WEEK_OF_YEAR=14,WEEK_OF_MONTH=
2,DAY_OF_MONTH=2,DAY_OF_YEAR=92,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOU
R=3,HOUR_OF_DAY=3,MINUTE=3,SECOND=46,MILLISECOND=604,ZONE_OFFSET=32400000,DST_OF
FSET=0]
GGGGyy年MMMMdd日 : 西暦06年4月02日
GGGyy年MMMMdd日 : 西暦06年4月02日
GGGGyy/MM/dd : 西暦06/04/02
GGGyy/MM/dd : 西暦06/04/02

1*************************************************************
Default Locale : ja_JP
Calendar#getInstance : ja_JP_JP

java.util.JapaneseImperialCalendar[time=1143914626664,areFieldsSet=true,areAllFi
eldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset
=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayO
fWeek=1,minimalDaysInFirstWeek=1,ERA=4,YEAR=18,MONTH=3,WEEK_OF_YEAR=14,WEEK_OF_M
ONTH=2,DAY_OF_MONTH=2,DAY_OF_YEAR=92,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=
0,HOUR=3,HOUR_OF_DAY=3,MINUTE=3,SECOND=46,MILLISECOND=664,ZONE_OFFSET=32400000,D
ST_OFFSET=0]
GGGGyy年MMMMdd日 : 西暦06年4月02日
GGGyy年MMMMdd日 : 西暦06年4月02日
GGGGyy/MM/dd : 西暦06/04/02
GGGyy/MM/dd : 西暦06/04/02

2*************************************************************
Default Locale : ja_JP
Calendar#getInstance : null

java.util.GregorianCalendar[time=1143914626664,areFieldsSet=true,areAllFieldsSet
=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=324000
00,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1
,minimalDaysInFirstWeek=1,ERA=1,YEAR=2006,MONTH=3,WEEK_OF_YEAR=14,WEEK_OF_MONTH=
2,DAY_OF_MONTH=2,DAY_OF_YEAR=92,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOU
R=3,HOUR_OF_DAY=3,MINUTE=3,SECOND=46,MILLISECOND=664,ZONE_OFFSET=32400000,DST_OF
FSET=0]
GGGGyy年MMMMdd日 : 西暦06年4月02日
GGGyy年MMMMdd日 : 西暦06年4月02日
GGGGyy/MM/dd : 西暦06/04/02
GGGyy/MM/dd : 西暦06/04/02

3*************************************************************
Default Locale : ja_JP_JP
Calendar#getInstance : null

java.util.JapaneseImperialCalendar[time=1143914626664,areFieldsSet=true,areAllFi
eldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset
=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayO
fWeek=1,minimalDaysInFirstWeek=1,ERA=4,YEAR=18,MONTH=3,WEEK_OF_YEAR=14,WEEK_OF_M
ONTH=2,DAY_OF_MONTH=2,DAY_OF_YEAR=92,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=
0,HOUR=3,HOUR_OF_DAY=3,MINUTE=3,SECOND=46,MILLISECOND=664,ZONE_OFFSET=32400000,D
ST_OFFSET=0]
GGGGyy年MMMMdd日 : 平成18年4月02日
GGGyy年MMMMdd日 : H18年4月02日
GGGGyy/MM/dd : 平成18/04/02
GGGyy/MM/dd : H18/04/02