日付文字列をJava 8.のDateTimeオブジェクトに変換しようとしています。次の行を実行すると:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);
次のエラーが表示されます。
Exception in thread "main" Java.time.format.DateTimeParseException:
Text '20140218' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor:
{},ISO resolved to 2014-02-18 of type Java.time.format.Parsed
at Java.time.format.DateTimeFormatter.createError(DateTimeFormatter.Java:1918)
at Java.time.format.DateTimeFormatter.parse(DateTimeFormatter.Java:1853)
at Java.time.LocalDateTime.parse(LocalDateTime.Java:492)
構文は、提案されているものと同じです here ですが、例外があります。 JDK-8u25
を使用しています。
Javaは、DateTimeとしてそのままのDate値を受け入れないことがわかりました。 LocalDateTimeの代わりにLocalDateを使用すると、問題が解決します。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);
本当に日付をLocalDateTimeオブジェクトに変換する必要がある場合は、LocalDate.atStartOfDay()を使用できます。これにより、指定された日付のLocalDateTimeオブジェクトが提供され、時、分、秒のフィールドが0に設定されます。
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();
誰かがこのトピック(私のように)をもう一度読む必要がある場合、正しい答えはDateTimeFormatter
の定義にあります、例えば:
private static DateTimeFormatter DATE_FORMAT =
new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
表示される場合は、オプションフィールドを設定する必要があります。そして、残りのコードはまったく同じでなければなりません。
これは本当に不明瞭で役に立たないエラーメッセージです。多くの試行錯誤の後、時間を解析しようとしないと、LocalDateTime
が上記のエラーを出すことがわかりました。代わりにLocalDate
を使用すると、エラーなしで機能します。
これは十分に文書化されておらず、関連する例外は非常に役に立ちません。
retrography's answer ..:を展開すると、LocalDate
ではなくLocalDateTime
を使用した場合でも、この同じ問題が発生しました。問題は、.withResolverStyle(ResolverStyle.STRICT);
を使用してDateTimeFormatter
を作成したため、uuuuMMdd
の代わりに日付パターンyyyyMMdd
を使用する必要がありました(つまり、「年」ではなく「年」)。
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseStrict()
.appendPattern("uuuuMMdd")
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);
(このソリューションは元々、レトログラフィの答えに対するコメントでしたが、多くの人にとって本当にうまくいくように見えるので、スタンドアロンの答えとして投稿することをお勧めしました。)
私がやったように、このエラーでここに着いた人には:
Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}
次の行から来ました。
LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));
24時間のパターンではなく、0時間で12時間のパターンを使用していたことが原因であることがわかりました。
大文字のHを使用して時間を24時間のパターンに変更すると、修正されます。
LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));
日付文字列に時間、分などの値が含まれていない場合、これをLocalDateTime
に直接変換することはできません。文字列onlyrepresent the year、month and dateのコンポーネントであるため、LocalDate
にのみ変換できます。正しいこと。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06
とにかくこれをLocalDateTime
に変換できます。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00
これを試してください:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy");
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);
任意の形式を追加できます。それは私のために働く!
これはうまくいきます
public class DateDemo {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
String date = "16-08-2018 12:10";
LocalDate localDate = LocalDate.parse(date, formatter);
System.out.println("VALUE="+localDate);
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
LocalDateTime parse = LocalDateTime.parse(date, formatter1);
System.out.println("VALUE1="+parse);
}
}
出力:
VALUE=2018-08-16
VALUE1=2018-08-16T12:10