モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

javaのSimpleDateFormatで「YYYY」指定した時の挙動

年末に突如発生したバグがあったのだけど、理由がよくわからない、というので調べてみました。


SimpleDateFormatで現在時間から日付を得ている部分があり、そこが問題だったようなのですが、その年のフォーマット指定が「yyyy」ではなく「YYYY」になっていました。
で、実はそれだと思ったんですが、テストで走らせてみると今はちゃんと動くのです。

不思議に思って下記のようにして日付を変えてテストしてみました。

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date testDate = sdf.parse("2014-12-28");

SimpleDateFormat sdf1 = new SimpleDateFormat("YYYY-MM-dd");
String date1 = sdf1.format(testDate);

SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
String date2 = sdf2.format(testDate);

すると「2014-12-27」まではちゃんと「2014」を返すのですが「2014-12-28」からは「2015」を返すようになっていました。


で、なんでそんな仕様になってるの?と思ったら

と教えてもらいました。
Androidの公式アプリでもこの地雷を踏んでいたとは…


ややこしい日付の書式について - dechnostick's blog

日付フォーマット yyyy と YYYY の違い - 強火で進め


Java 7 から存在する仕様で「Y」は「暦週の基準年」を表すんだそうです。

SimpleDateFormat (Java Platform SE 7 )


これ、年末になってからはじめて発火するから、ほんと嫌がらせのようなバグになりますね。