web-dev-qa-db-ja.com

SimpleDateFormatが「YYYY-MM-dd HH:mm」を解析するときに誤った日付時刻を生成する

StringYYYY-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()));
15
Sas

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

47

大文字ではなく小文字のYを使用してください。つまり、yyyyはYYYYではない

ここのコメントをチェックしてください: Java Simple Date Format およびそこで参照されている他の回答。

7
Raymond Machira

2つの問題があります。

  1. 書式文字列は"yyyy-MM-dd HH:mm"
  2. 時間を格納するデータ型はTimeStampであり、データベースではDateではありません。

両方を修正すると、時間とともに日付を保存および取得できるようになります。

5
Rais Alam

これが最新の答えです。その他の回答は、2013年に書かれたときの良い回答でした。その翌年、古いクラスDateSimpleDateFormatや友人の代わりに、最新の日付と時刻の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()を使用することに注意してください。

2
Ole V.V.