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.ROOT
。uuuu
は署名された年です。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
、日付文字列からのタイムゾーン情報を保持することです。後でこれが必要になる可能性がある場合は、このオプションを選択してください。
暦年と週ベースの年の違いは、この質問への回答で説明されています。
新しいクラスを使用できない、または使用したくない場合は、使用する正しいパターン文字列がSimpleDateFormat
Reimeusの回答にあります。ただし、ロケールを明示的に指定することをお勧めします。たとえば、次のようになります。
SimpleDateFormat input = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",
Locale.UK);
ロケールは、テキスト/単語が含まれておらず、数字のみが含まれているため、出力形式には必要ない可能性があります。