LocalDateTimeの解析時にTemporalAccessorからLocalDateTimeを取得できない(Java 8)


151

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)

構文はここで提案されているものと同じですが、例外があります。使用していJDK-8u25ます。

回答:


177

Javaが日付時刻として裸の日付値を受け入れないことがわかりました。LocalDateTimeの代わりにLocalDateを使用すると、問題が解決します。

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

42
それだけの価値があるので:を使用LocalDateしている場合でも使用していない場合でも、同じ問題が発生しましたLocalDateTime。問題は、私がDateTimeFormatterusingを作成したことでした。その.withResolverStyle(ResolverStyle.STRICT);ため、uuuuMMdd代わりに日付パターンを使用する必要がありましたyyyyMMdd(つまり、「年号」ではなく「年号」)。
ZeroOne 2016年

72

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

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

2
修正:その日の初めの時間に設定します。
Trejkaz

20
LocalDateTime.fromatStartOfDay()すでに戻るので、不要なようLocalDateTimeです。
Dariusz

1
scala:val time = LocalDate.parse( "20171220"、DateTimeFormatter.ofPattern( "yyyyMMdd"))。atStartOfDay.format(DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss"))
Woody Sun

48

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

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


1
これは、たとえば次のようなメソッドの真のユニバーサルソリューションです。Long getFileTimestamp(String file、Pattern pattern、DateTimeFormatter dtf、int group); ここでは、さまざまなパターンがあり、DateTimeFormetter、w /およびw / o時間が指定されています。
toootooo

静的フィールドにすることはできますか?その方法で作成されたインスタンスがスレッドセーフであることをJavadocで確認していません
Kamil Roman

parseDefaulting呼び出した後を忘れずに追加してくださいappendPattern。そうでなければそれは与えるでしょうDateTimeParseException
wittyameta 2018年

31

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

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


25

拡大retrographyの答え ..:私は使用した場合にも、これと同じ問題を抱えていません。問題は、私がusingを作成したことでした。そのため、代わりに日付パターンを使用する必要がありました(つまり、「年号」ではなく「年号」)。LocalDateLocalDateTimeDateTimeFormatter.withResolverStyle(ResolverStyle.STRICT);uuuuMMddyyyyMMdd

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .parseStrict()
  .appendPattern("uuuuMMdd")
  .toFormatter()
  .withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);

(このソリューションは元々はレトログラフィの回答に対するコメントでしたが、明らかに多くの人にとって非常にうまく機能するため、スタンドアロンの回答として投稿することを勧められました。)


1
このリンクで「y」ではなく「u」が回答された理由の答えuuuu-versus-yyyy-in-datetimeformatter-formatting-pattern-codes-in-java @Peru
prashanth

23

私がしたように、このエラーでここに着いた人のために:

Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}

それは次の行から来ました:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));

24時間のパターンではなく、12時間のパターンを0時間に使用していたことが原因であることがわかりました。

大文字のHを使用して時間を24時間パターンに変更すると、修正されます。

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));

12

日付文字列に時間、分などの値が含まれていない場合、これをに直接変換することはできませんLocalDateTimeLocalDate文字列は年、月、日付のコンポーネントのみを 表すので、に変換できます。これは正しいことです。

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

また、形式が正しいことを確認してください。この修正は、フォーマットをyyyy-mm-dd本来あるべきタイミングに設定するまで機能しませんでしたyyyy-MM-dd
patstuart

0

これを試してください:

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

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


0

これはうまくいきます

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.