Java8 の Date & Time API ではまった。

Java

日経ソフトウェア4月号の「至極の Java クイズ」で JSR310 の問題がでていた。

知らない内容が鍵となっていてとても勉強になった。

しかし、それにもかかわらずはまってしまった。

ここでクイズです。

下記プログラムを実行するとどうなるでしょうか?

1.2014-03-03

2.2014-3-03

3.2014-3-3

4.実行時エラー

解りましたでしょうか?

 

このプログラムは DateTimeFormatter でパターンを設定し、ResolverStyle を設定しただけのシンプルなものですね。

LocalDate d = LocalDate.parse(“2014/3/03”, DateTimeFormatter.ofPattern(“yyyy/M/d”)
                .withResolverStyle(ResolverStyle.STRICT));

この問題の答えは 4.実行時エラーです。

Exception in thread “main” java.time.format.DateTimeParseException: Text ‘2014/03/10’ could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {YearOfEra=2014, MonthOfYear=3, DayOfMonth=10},ISO of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1919)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1854)
    at java.time.LocalDate.parse(LocalDate.java:400)
    at jp.yucchi.localdateparsetest.LocalDateParseTest.main(LocalDateParseTest.java:15)
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {YearOfEra=2014, MonthOfYear=3, DayOfMonth=10},ISO of type java.time.format.Parsed
    at java.time.LocalDate.from(LocalDate.java:368)
    at java.time.LocalDate$$Lambda$7/980546781.queryFrom(Unknown Source)
    at java.time.format.Parsed.query(Parsed.java:226)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1850)
    … 2 more

 

ResolverStyle.LENIENT もしくは ResolverStyle.SMART だと 2014-03-03 と表示されます。

何故、ResolverStyle.STRICT だとエラーになるか解りますか?

エラーメッセージを読んでピンッてきたかたもいると思います。

ResolverStyle.STRICT は厳密に判定を下すので DateTimeFormatter.ofPattern(“yyyy/M/d”) の y をきっちり解釈してしまうのです。

ここでパターン設定に使われている y は year-of-era となっています。

これがエラーを引き起こす原因です。

じゃあどうすればいいかというと u を使えばいいのです。

u は year なので厳密に判断される場合でも全然問題ないのです。

よって、このプログラムを正しく動作させるには

LocalDate d = LocalDate.parse(“2014/3/03”, DateTimeFormatter.ofPattern(“uuuu/M/d”)
                .withResolverStyle(ResolverStyle.STRICT));

と DateTimeFormatter.ofPattern(“yyyy/M/d”) を DateTimeFormatter.ofPattern(“uuuu/M/d”) としてあげればいいのです。

よく見かけるサンプルは DateTimeFormatter.ofPattern(“yyyy/M/d”) となっているのが多いので注意が必要ですね。(^_^)

Hatena タグ:

JJUGイベント 「祝☆Java 8 Launch」

Java

昨日、東京で JJUGイベント 「祝☆Java 8 Launch」が開催された。

私は仕事で参加出来なかったが(休日でも東京まで行く元気は無いかも(^_^;) YouTube にその模様がアップされているので保存用に貼っておきます。

途中まで見かけたのですが昨日は YouTube が非常に重くあきらめました。

笑っていいともに安倍首相が出演したらしくその影響だったのかな?

ちなみに今の日本の総理大臣が安倍さんだって昨日知りました。( ̄。 ̄;)

アベノミクスって安倍首相からもじって名付けられたとか・・・ やっと納得!

政治にあまり興味がないのと NEWS もほとんど見ないので ← 非国民です!

さて、どうでもいいことはほっといて動画をどうぞ!

 

祝 Java SE 8 正式リリース

 

祝☆Java 8 Launch – 徹底解説!Project Lambdaのすべて リターンズ 吉田 真也 @bitter_fox #jjug

 

祝☆Java 8 Launch – Brand new Date and Time API 蓮沼 賢志 @khasunuma #jjug

 

祝☆Java 8 Launch – null書いたら負け!Java8コーディング作法 @kis #jjug

祝☆Java 8 Launch JavaFX – GUI by Illusion @skrb #jjug

 

祝☆Java 8 Launch from old Java to modern Java – reloaded @cero_t #jjug

 

祝☆Java 8 Launch – Raspberry Pi on Java ショートアップデート #jjug @masafumiohta

 

まだほとんど見てないのでこれからゆっくり見る!

凄く楽しそうな雰囲気が十分に伝わってくる!

JJUG の録画スタッフのかたはじめ、みなさまに感謝感激です!

Java 最高! (^_^)

Hatena タグ: