LocalDateTime을 구문 분석 할 때 TemporalAccessor에서 LocalDateTime을 가져올 수 없음 (Java 8)


150

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는 Bare Date 값을 DateTime으로 허용하지 않습니다. LocalDateTime 대신 LocalDate를 사용하면 문제가 해결됩니다.

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

42
그만한 가치가있는 경우 : 사용 LocalDate하지 않을 때도 동일한 문제가 발생했습니다 LocalDateTime. 문제는 내가 DateTimeFormatterusing 을 만들었 기 .withResolverStyle(ResolverStyle.STRICT);때문에 uuuuMMdd대신 날짜 패턴을 사용해야했습니다 yyyyMMdd(예 : "연도"대신 "연도")!
ZeroOne

71

날짜를 LocalDateTime 객체로 변환해야하는 경우 LocalDate.atStartOfDay ()를 사용할 수 있습니다. 그러면 지정된 날짜에시, 분 및 초 필드가 0으로 설정된 LocalDateTime 객체가 제공됩니다.

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

2
수정 : 해당 날짜가 시작되는 시간으로 설정하십시오 .
Trejkaz

20
LocalDateTime.fromatStartOfDay()이미 반환 된 것처럼 불필요한 것 같습니다 LocalDateTime.
다리우스

1
스칼라 : 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, 시간 및 시간이 지정되지 않았습니다.
toootooo

정적 필드 일 수 있습니까? Javadoc에서 인스턴스가 그런 방식으로 생성 된 것이 스레드로부터 안전하다는 것을 발견하지 못했습니다.
Kamil Roman

parseDefaulting전화 한 후에 를 추가해야합니다 appendPattern. 그렇지 않으면을 줄 것 DateTimeParseException입니다.
wittyameta

31

이것은 실제로 불분명하고 도움이되지 않는 오류 메시지입니다. 많은 시행 착오 끝에 LocalDateTime시간을 구문 분석하지 않으면 위의 오류가 발생 한다는 것을 알았 습니다. LocalDate대신 사용 하면 오류없이 작동합니다.

이것은 문서화가 잘되어 있지 않으며 관련 예외는 매우 도움이되지 않습니다.


25

회고의 대답을 확장 .. : 사용 LocalDate하지 않을 때도 동일한 문제가 발생했습니다 LocalDateTime. 문제는 내가 DateTimeFormatterusing 을 만들었 기 .withResolverStyle(ResolverStyle.STRICT);때문에 uuuuMMdd대신 날짜 패턴을 사용해야했습니다 yyyyMMdd(예 : "연도"대신 "연도")!

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

(이 솔루션은 원래 회고의 답변에 대한 의견 이었지만 많은 사람들에게 실제로 잘 작동하기 때문에 독립형 답변으로 게시하도록 권장되었습니다.)


1
"U"대신에 "Y"의이 링크에 응답 한 이유에 대한 대답 UUUU - 대 - YYYY-에서-datetimeformatter 된 패턴 - 코드 - 포맷 - 자바 @Peru
프라 샨스

23

내가 한 것처럼이 오류로 여기에 착륙 한 사람은 다음과 같습니다.

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

12

날짜 문자열에 시간, 분 등의 값이 포함되어 있지 않으면 직접로 변환 할 수 없습니다 LocalDateTime. 당신은 단지로 변환 할 수 있습니다 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

또한 형식이 올바른지 확인하십시오. 이 수정은 형식을 yyyy-mm-dd때로 설정해야하기 때문에 작동하지 않았습니다 yyyy-MM-dd.
patstuart 2016 년

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.