3

Javaで日付文字列「FriSep2115:23:59CEST2012」を「2012-09-21T15:23:59」に変換したい。SimpleDateFormatと次のコードでこれを試しました。

try {
    String dateString = "Fri Sep 21 15:23:59 CEST 2012";
    SimpleDateFormat input = new SimpleDateFormat("EEE MM dd HH:mm:ss z YYYY");
    SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

    Date date = input.parse(dateString);
    System.out.println(output.format(date));            
} catch (ParseException e) {
    e.printStackTrace();
}

しかし、入力解析により、java.text.ParseExceptionが発生します。http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.htmlでドキュメントを読みましたが、エラーを見つけることができません。

この文字列の入力解析を解決するフォーマット文字列はどれですか?

4

3 に答える 3

8

使用する

"EEE MMM dd HH:mm:ss z YYYY"

3MMM

于 2012-09-21T14:41:42.627 に答える
1

4つのポイント:

  • 可能であれば、古いものではなく、Java 8で導入された(およびJava 6および7にバックポートされた)新しい日付と時刻のクラスを使用することをお勧めしますSimpleDateFormat
  • 日付文字列の曜日と月の言語と一致するロケールを指定する必要があります。
  • ドキュメントからは明らかではありませんがMM、パターン内の文字列は2桁の月の数字を意味すると考えられています。3文字の月の略語には、が必要MMMです。これがおそらくParseExceptionを引き起こしたものです(ただし、間違ったロケールでも発生する可能性があります)。
  • 大文字Yは週の年です。このバグは、週の年と暦年が通常、正月に近い数日だけ異なるため、長い間見過ごされがちです。暦年には小文字を使用する必要がありますy

新しい日付と時刻のクラスを使用する方法は次のとおりです。

    String dateString = "Fri Sep 21 15:23:59 CEST 2012";
    DateTimeFormatter input = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss z uuuu",
            Locale.ROOT);
    try {
        LocalDateTime date = LocalDateTime.parse(dateString, input);
        System.out.println(date.toString());
    } catch (DateTimeParseException dtpe) {
        System.err.println(dtpe.getMessage());
    }

これは印刷します:

2012-09-21T15:23:59

の代わりに適切なロケールを入力してくださいLocale.ROOTuuuuは署名された年です。0は紀元前1年、-1から2年などに対応します。yyyy年がAD(現在の時代)であることが確実な場合に使用できます。

希望するフォーマットがすぐに出てくることに気付くでしょうLocalDateTime.toString()。明示的なフォーマットは必要ありません。ただし、別の方法があります。

        ZonedDateTime date = ZonedDateTime.parse(dateString, input);
        System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

ZonedDateTimeではなくを使用する利点はLocalDateTime、日付文字列からのタイムゾーン情報を保持することです。後でこれが必要になる可能性がある場合は、このオプションを選択してください。

暦年と週ベースの年の違いは、この質問への回答で説明されています。

新しいクラスを使用できない、または使用したくない場合は、使用する正しいパターン文字列がSimpleDateFormatReimeusの回答にあります。ただし、ロケールを明示的に指定することをお勧めします。たとえば、次のようになります。

        SimpleDateFormat input = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",
                Locale.UK);

ロケールは、テキスト/単語が含まれておらず、数字のみが含まれているため、出力形式には必要ない可能性があります。

于 2017-04-19T23:16:38.123 に答える
0

次を使用できます。

SimpleDateFormat input = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
于 2012-09-21T14:45:04.150 に答える