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の使い道がわからない・・・