【JAVA】SimpleDateFormatで日付文字列をフォーマットできない場合の対処法

今回は、SimpleDateFormat で String 型の日付をフォーマットしようとしたときにエラーを吐いてしまい困ったことがあったので、その解決策について記載したいと思います。

具体的なコードは以下の通り。

「yyyyMMddhhmmss」形式の文字列を「yyyy/MM/dd hh:mm:ss」にフォーマットしようとした結果、エラーを吐いてしまいました。

// フォーマットパターン指定
SimpleDateFormat slashSdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");

// 変換対象の日付文字列
String strDate = "20230101000000";

// フォーマット
slashSdf.format(strDate);

動作結果は、

Cannot format given Object as a Date

となってしまいフォーマットに失敗してしまいました。

String 型の日付文字列を Date 型に一度変換してからフォーマットを行うことで、解決することができます。

今回の場合はこのようになります。

// 型変換用
SimpleDateFormat nothingSdf = new SimpleDateFormat("yyyyMMddhhmmss");

// フォーマット変換用
SimpleDateFormat slashSdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");

// 変換対象の日付文字列
String strDate = "20230101000000";

// 文字列型から日付型に変換
Date nothingDate = nothingSdf.parse(strDate);

// 変換した日付型のフォーマットを変換
String slashDate = slashSdf.format(nothingDate);

※パターンの異なる SimpleDateFormat で Date 型に変換してしまうと、下記のように ParseException が発生してしまうので、型変換用の SimpleDateFormat を宣言してあげる必要があります。

java.text.ParseException: Unparseable date: "20230101000000"

このように、一度文字列型を日付型に変換してからフォーマットを行うことで、エラーを吐かずに変換することができます。

String 型の日付文字列がフォーマットできない理由はわかりませんが、開発を進める際に少し気になったので今回は記事にしてみました。もし同じような方がいれば、参考にしていただければと思います!