LoginSignup
1
1

More than 5 years have passed since last update.

Javaで西暦和暦混合出力

Last updated at Posted at 2016-12-31

前説

西暦と和暦を並べて出すということはまあまあありそうな気がする。Excelでいうところの「yyyy(ggge)"年"mm"月"dd"日"」をJava的に出す。

java8.java
JapaneseDate japdate = JapaneseDate.now();
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy");
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("'('Gyy')年'MM'月'dd'日'");
System.out.println(LocalDate.from(japdate).format(dtf1) + japdate.format(dtf2));

で、たぶんあっていると思う。
2017/01/17追加↓
あってなかった(汗)

java8.java
JapaneseDate japdate = JapaneseDate.now();
DateTimeFormatter dtf3 = DateTimeFormatter.ofPattern("uuuu'('Gyy')年'MM'月'dd'日'");
System.out.println(japdate.format(dtf3));

「u」というパターン文字があり、そっちを使えば一発で行ける。ちゃんと進化してた。
2017/01/17追加↑

java6.java
Locale loc = new Locale("ja", "JP", "JP");
Calendar cal = Calendar.getInstance(loc);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy");
SimpleDateFormat sdf2 = new SimpleDateFormat("'('GGGGyyyy')年'MM'月'dd'日'", loc);
System.out.println(sdf1.format(cal.getTime()) + sdf2.format(cal.getTime()));

で、ひとまずあっているはず。

補足

CalendarのgetInstanceに日本的なロケールを渡すことで、グレゴリアンカレンダー(java.util.GregorianCalendar)ではなく、日本的帝国カレンダー(java.util.JapaneseImperialCalendar)を返却させることができるので、いわゆる日本の元号対応が可能になるという話。
元号の境目の解釈が微妙なので安易に使っちゃダメなんていう話もあった気がするが、基本的に最近の日付を出すならば問題はないという理解。

蛇足?

ただ、このロケールのコンストラクタに文字列を引き渡すのがなんとなく気持ち悪いので、単純に明示的に日本を渡すという

Locale loc = Locale.JAPAN;
Calendar cal = Calendar.getInstance(loc);

で、よいように思ったのだが、これでは日本的帝国カレンダーが返却されない。
理由は Locale.JAPAN.getVariant() が "JP" を返却しないから?

これ、そういうもの?なんか変?

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1