JDK1.6におけるTimestampのvalueOfの実装変更について

TimestampクラスのvalueOfメソッドの実装がJDK1.6でstrictモードに変わっていて
酷い目にあったので仕様の詳細についてまとめてみました。
月日の部分が2桁ないとIllegalArgumentExceptionが発生します。
1~9の値の場合はゼロ埋めが必要になります。
どういうわけか1.6では年月日のパースの実装が変更されており
年月日の各要素の長さ判定が追加されています。
それぞれ文字列の長さが、4、2、2でないと
IllegalArgumentExceptionが投げられます。
時分秒については1.5以前のままで1桁でも大丈夫ですが
2桁にゼロ埋めして渡しておくのが無難ですね。

原因の特定にはこちらのサイトを参考にさせてもらっていました、感謝。

Jdk1.5と1.6でTimestampクラスのvalueOfメソッドの挙動が違う件|ヘビィ・SMD!


・JDK1.6でのvalueOfメソッドの挙動まとめ

import java.sql.Timestamp;

public class TestTimestamp {

    public static void main(String[] args) {
        doTest("2013-1-11 12:13:14");  // error
        doTest("2013-10-1 12:13:14");  // error
        doTest("2013-01-11 12:13:14"); // success
        doTest("2013-10-01 12:13:14"); // success
        doTest("2013-10-11 1:13:14");  // success
        doTest("2013-10-11 12:3:14");  // success
        doTest("2013-10-11 12:13:4");  // success
    }

    private static void doTest(String dateTimeString) {
        try {
            Timestamp converted = Timestamp.valueOf(dateTimeString);
            System.out.println(converted.toString());
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }

}

ちなみに実行すると以下のように出力されます。

convert error -> 2013-1-11 12:13:14
java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
at java.sql.Timestamp.valueOf(Timestamp.java:194)
at test.TestTimestamp.doTest(TestTimestamp.java:19)
at test.TestTimestamp.main(TestTimestamp.java:8)
convert error -> 2013-10-1 12:13:14
java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
at java.sql.Timestamp.valueOf(Timestamp.java:194)
at test.TestTimestamp.doTest(TestTimestamp.java:19)
at test.TestTimestamp.main(TestTimestamp.java:9)


2013-01-11 12:13:14.0
2013-10-01 12:13:14.0
2013-10-11 01:13:14.0
2013-10-11 12:02:14.0
2013-10-11 12:13:04.0