Java6 と Java8 で振る舞いが変わっていたのでメモ。

Java6 では下記コードがエラーにならず結果が出力されます。

System.out.println(java.sql.Timestamp.valueOf("2016-13-01")); // 2017-01-01

ところが Java8 だと下記のエラーが発生します。

Exception in thread "main" java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
	at java.sql.Timestamp.valueOf(Timestamp.java:204)

もちろん存在しない日付、例えば 2016-12-32 などを指定した場合にもエラーとなります。 Java6 から Java7 になる際に java.sql.Timestamp に対してかなりの数のバグフィックスが行われたようで、 おそらくその修正のどこかで振る舞いが変わったのだと思います。