java8での日時書式化

java8で日時を書式化してみた。

// 一般的?
print("LocalDateTime");
print(LocalDateTime.now()); // 2014-03-28T01:09:49.059
print(LocalDateTime.now().format(DateTimeFormatter.ofPattern("Gyyyy/MM/dd HH:mm:ss"))); // 西暦2014/03/28 01:09:49

// タイムゾーンを意識しなければこれらは使わない?
print("OffsetDateTime");
print(OffsetDateTime.now()); // 2014-03-28T01:09:49.115+09:00
print(OffsetDateTime.now().format(DateTimeFormatter.ofPattern("Gyyyy/MM/dd HH:mm:ss"))); // 西暦2014/03/28 01:09:49
print("ZonedDateTime");
print(ZonedDateTime.now()); // 2014-03-28T01:09:49.116+09:00[Asia/Tokyo]
print(ZonedDateTime.now().format(DateTimeFormatter.ofPattern("Gyyyy/MM/dd HH:mm:ss"))); // 西暦2014/03/28 01:09:49

和暦を使う場合はこうする。

print("JapaneseDate");
print(JapaneseDate.now()); // Japanese Heisei 26-03-28
print(JapaneseDate.now().format(DateTimeFormatter.ofPattern("Gyy年MM月dd日"))); // 平成26年03月28日

JapaneseDateは名前の通り日付しか持たない。
時間を持たせる時はこうする。

print("和暦と時間");
print(JapaneseDate.now().atTime(LocalTime.now())); // Japanese Heisei 26-03-28T01:09:49.122
print(JapaneseDate.now().atTime(LocalTime.now()).format(DateTimeFormatter.ofPattern("Gyy年MM月dd日 HH時mm分ss秒"))); // 平成26年03月28日 01時09分49秒

ちょっと疑問を感じたのでテスト

// 擬似的にatTime()の外と中で日付をまたぐ
// GMTの15時=JSTの真夜中0時
print("和暦と時間。日付またぎテスト");
print(JapaneseDate.now(Clock.fixed(Instant.parse("2014-03-27T14:59:59.999Z"), ZoneId.systemDefault())).atTime(LocalTime.now(Clock.fixed(Instant.parse("2014-03-27T15:00:00.000Z"), ZoneId.systemDefault())))); // Japanese Heisei 26-03-27T00:00
print(JapaneseDate.now(Clock.fixed(Instant.parse("2014-03-27T14:59:59.999Z"), ZoneId.systemDefault())).atTime(LocalTime.now(Clock.fixed(Instant.parse("2014-03-27T15:00:00.000Z"), ZoneId.systemDefault()))).format(DateTimeFormatter.ofPattern("Gyy年MM月dd日 HH時mm分ss秒"))); // 平成26年03月27日 00時00分00秒

案の定3/27の0時になってしまった。

正しく取得するにはこうすることになるのかな?

print("和暦と時間その2");
Clock now = Clock.fixed(Instant.parse("2014-03-27T14:59:59.999Z")/*実際にはInstant.now()にする*/, ZoneId.systemDefault());
// Clock.now()としてはいけない
// Clock.now()で作成したインスタンスは作成した時の時間を保持せず、必要に応じてシステム日時を取得しなおしている
print(JapaneseDate.now(now).atTime(LocalTime.now(now))); // Japanese Heisei 26-03-27T23:59:59.999
print(JapaneseDate.now(now).atTime(LocalTime.now(now)).format(DateTimeFormatter.ofPattern("Gyy年MM月dd日 HH時mm分ss秒"))); // 平成26年03月27日 23時59分59秒

2014/3/28追記
こっちの方が簡単かな?

print(LocalDateTime.now().format(DateTimeFormatter.ofPattern("Gy").withChronology(JapaneseChronology.INSTANCE)))

だとするとJapaneseDateの使い道がわからない・・・