web-dev-qa-db-ja.com

LocalDateTimeの解析時にTemporalAccessorからLocalDateTimeを取得できません(Java 8)

日付文字列を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を使用しています。

107
retrography

Javaは、DateTimeとしてそのままのDate値を受け入れないことがわかりました。 LocalDateTimeの代わりにLocalDateを使用すると、問題が解決します。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);
130
retrography

本当に日付をLocalDateTimeオブジェクトに変換する必要がある場合は、LocalDate.atStartOfDay()を使用できます。これにより、指定された日付のLocalDateTimeオブジェクトが提供され、時、分、秒のフィールドが0に設定されます。

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();
53
Øyvind Mo

誰かがこのトピック(私のように)をもう一度読む必要がある場合、正しい答えは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(); 

表示される場合は、オプションフィールドを設定する必要があります。そして、残りのコードはまったく同じでなければなりません。

36
Iulian David

これは本当に不明瞭で役に立たないエラーメッセージです。多くの試行錯誤の後、時間を解析しようとしないと、LocalDateTimeが上記のエラーを出すことがわかりました。代わりにLocalDateを使用すると、エラーなしで機能します。

これは十分に文書化されておらず、関連する例外は非常に役に立ちません。

28
Tom B

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

(このソリューションは元々、レトログラフィの答えに対するコメントでしたが、多くの人にとって本当にうまくいくように見えるので、スタンドアロンの答えとして投稿することをお勧めしました。)

18
ZeroOne

私がやったように、このエラーでここに着いた人には:

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"));
13
mawburn

日付文字列に時間、分などの値が含まれていない場合、これを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
10
prime

これを試してください:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);

任意の形式を追加できます。それは私のために働く!

1
Vinay Kasarla

これはうまくいきます

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
1
Jeff Cook