20

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.");
}

プロデュース:

Sun Dec 30 08:30:00 EST 2012 (間違った)

Lenient をオフに設定しようとしましたが、うまくいきませんでした。

アップデート

答えてくれたSudhanshuに感謝します。Java変換を解決するのに役立ちました。上記のコードから返された日付をデータベースに入力すると、日付は正しく取得されますが、時刻は常に00:00.

ps.setDate(3, new java.sql.Date(app.getDate().getTime()));
4

5 に答える 5

57

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

于 2013-04-10T04:30:18.777 に答える
7

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

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

于 2013-04-10T04:54:25.463 に答える
2

これが現代の答えです。他の回答は、2013年に書かれたときは素晴らしい回答でした。その翌年、古いクラスや友人の代わりとして、最新の日付と時刻のAPIが登場しましDateSimpleDateFormat。私見では、今すぐ新しいクラスを使用する必要があります。それらははるかにプログラマフレンドリーです。

    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()

于 2017-06-21T19:37:10.510 に答える