String
(YYYY-MM-dd HH:mm
)からDate
へ、ただし予想よりも間違った日付が取得されます。
コード:
Date newDate = null;
String dateTime = "2013-03-18 08:30";
SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd HH:mm", Locale.ENGLISH);
df.setLenient(false);
try {
newDate = df.parse(dateTime);
} catch (ParseException e) {
throw new InvalidInputException("Invalid date input.");
}
生成する:
2012年12月30日08:30:00 EST 2012(誤り)
Lenientをオフに設定してみましたが、うまくいきませんでした。
更新
Sudhanshuの回答に感謝します。Java変換を解決するのに役立ちました。上記のコードから返された日付をデータベースに入力すると、日付は正しく取得されますが、時間は常に00:00
。
ps.setDate(3, new Java.sql.Date(app.getDate().getTime()));
YYYYはyyyy-
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH);
こちらでSimpleDateFormatのドキュメントを確認してください
Java 6: http://docs.Oracle.com/javase/6/docs/api/Java/text/SimpleDateFormat.html
Java 7: http://docs.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html
大文字ではなく小文字のYを使用してください。つまり、yyyyはYYYYではない
ここのコメントをチェックしてください: Java Simple Date Format およびそこで参照されている他の回答。
2つの問題があります。
"yyyy-MM-dd HH:mm"
。TimeStamp
であり、データベースではDate
ではありません。両方を修正すると、時間とともに日付を保存および取得できるようになります。
これが最新の答えです。その他の回答は、2013年に書かれたときの良い回答でした。その翌年、古いクラスDate
、SimpleDateFormat
や友人の代わりに、最新の日付と時刻のAPIが出ました。私見あなたは今新しいクラスを使うべきです。彼らはよりプログラマーフレンドリーです。
_ 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()
を使用することに注意してください。