String
まず、 Postgresデータベースから日付を取得するべきではありません。日付を表すタイプのオブジェクトとして取得する必要があります。
第二に、2013年には、一般的で合理的な使用でしDate
たSimpleDateFormat
が、日が経ち、新しくより良い日付と時刻のクラスが出てきて、一般的に使用されるようになりました。私見では、古いクラスはもう使用すべきではなく、古くからあると思います。
データベースからLocalDate
オブジェクトを取得するには:ResultSet
LocalDate da = yourResultSet.getObject(3, LocalDate.class);
(日付はクエリの列3にあると想定しています)。
にフォーマットするにはdd-MM-yyyy
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
String strDateTime = da.format(formatter);
System.out.println("==String date is : " + strDateTime);
これにより、次のような出力が得られます
==String date is : 21-02-2013
最後に、質問のような文字列があり、それを目的の形式に再フォーマットしたい場合は、次のようにします。
String strDate = "2013-02-21";
LocalDate da = LocalDate.parse(strDate);
System.out.println("==Date is ==" + da);
このプリント
==Date is ==2013-02-21
文字列が、最新の日付と時刻のクラスのデフォルトであるISO8601標準の日付形式と一致するという事実を利用しています。したがって、この場合、他の形式を解析する場合のように、解析に明示的なフォーマッターは必要ありません。
希望のフォーマットへのフォーマットは、以前とまったく同じように行われます。
古いクラスの問題の例
私のコンピューターでは、質問のコードからの出力は次のとおりです。
==Date is ==Tue Aug 06 00:00:00 CET 26
==String date is : 06-08-0026
あなたは明らかに間違った結果を得ており、何が間違っていたのか見当がつかない。間違っていたのは、db日付文字列を、新しい文字列用に意図したフォーマッタで解析していたこと2013-02-21
です。したがって、2013年2月21日ADとして解析されます。2013年2月はありませんか?デフォルト設定では問題ありません。次の月と年に日数をカウントし続け、5年半後の8月6日に終了しますが、それでも歴史の非常に早い段階です。dd-MM-yyyy
SimpleDateFormat
現代のクラスで同じようにしようとすると:
LocalDate.parse(strDate, formatter);
—取得しjava.time.format.DateTimeParseException: Text '2013-02-21' could not be parsed at index 2
ます。これは、フォーマッタが2桁の日を示していたため、2桁を解析した後、入力文字列にさらに桁が含まれている場合、エラーであり、そのように報告されます。私はこの振る舞いがより正確でより役立つと思います。