これが現代の答えです。他の回答は、2013年に書かれたときは素晴らしい回答でした。その翌年、古いクラスや友人の代わりとして、最新の日付と時刻のAPIが登場しましDate
たSimpleDateFormat
。私見では、今すぐ新しいクラスを使用する必要があります。それらははるかにプログラマフレンドリーです。
LocalDateTime newDate = null;
String dateTime = "2013-03-18 08:30";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm", Locale.ENGLISH);
try {
newDate = LocalDateTime.parse(dateTime, dtf);
} catch (DateTimeParseException e) {
throw new InvalidInputException("Invalid date input.");
}
クラス名を除いて、古いコードとそれほど違いはありません。他の例では違いがあります。通常、最新のクラスはより明確なコードを提供し、エラーの可能性を減らします。
違いのちょっとしたデモンストレーションとして、大文字を含むフォーマット パターン文字列を試してみましょうYYYY
。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm", Locale.ENGLISH);
これで、コードはjava.time.format.DateTimeParseException: Text '2013-03-18 08:30' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MonthOfYear=3, DayOfMonth=18, WeekBasedYear[WeekFields[SUNDAY,1]]=2013},ISO resolved to 08:30 of type java.time.format.Parsed
. 長いですね。注意すべきことは、言及されているフィールドには年がなく、WeekBasedYear だけであるということです。同じではありません。そして、これはまさに大文字Y
が週ベースの年 (週番号でのみ有用) であり、y
年には小文字を使用する必要があるためであることがわかっているかもしれません。この動作は、古いクラスが行っていたよりも少し役立つと思います。それらは間違った結果を返し、すべてがうまくいっているふりをして、何が間違っていたのか完全にわからないままにしました。
次に、日時をデータベースに保存したいということを理解しました。昔は、適切なjava.sql
タイプに変換していました。もう必要ありません。JDBC 4.2 ドライバーを使用すると、次のことができると思います。
ps.setObject(3, newDate);
ただし、これをデータベースでテストしていません。setObject()
の代わりに使用することに注意してくださいsetDate()
。