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