LocalDateTime(Java 8)을 해석할 때 TemporalAccessor에서 LocalDateTime을 가져올 수 없습니다.
Java 8에서 날짜 문자열을 Date Time 개체로 변환하려고 합니다.다음 행 실행 시:
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
.
Java는 최소 날짜 값을 Date Time으로 받아들이지 않는 것으로 나타났습니다.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();
옵션 필드가 나타나면 설정해야 합니다.그리고 나머지 코드는 정확히 같아야 합니다.
편집 : wititiameta 코멘트에서 유용한 내용:
appendPattern을 호출한 후 parseDefaulting을 추가해야 합니다.그렇지 않으면 Date TimeParseException이 표시됩니다.
이것은 매우 불명확하고 도움이 되지 않는 에러 메시지입니다.많은 시행착오 끝에 알았다LocalDateTime
시간을 해석하지 않으면 위의 오류가 나타납니다.사용방법LocalDate
에러 없이 동작합니다.
이것은 문서화되어 있지 않고, 관련된 예외는 매우 도움이 되지 않습니다.
나처럼 실수를 해서 여기 온 사람들을 위해:
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"));
복고사진의 해답에 대해 자세히 설명하겠습니다.: 사용시에도 같은 문제가 발생하였습니다.LocalDate
가 아니라LocalDateTime
문제는 내가 내 삶을 만들었다는 거야DateTimeFormatter
사용..withResolverStyle(ResolverStyle.STRICT);
그래서 나는 날짜 패턴을 사용해야만 했다.uuuuMMdd
대신yyyyMMdd
(즉, "연령"이 아닌 "연령")
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseStrict()
.appendPattern("uuuuMMdd")
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);
(이 솔루션은 원래 복고적인 답변에 대한 코멘트였지만, 많은 사람들에게 매우 효과가 있다고 보여 독립형 답변으로 게시하도록 권유받았습니다.)
date String에 시간, 분 등의 값이 포함되지 않은 경우 이를 직접 변환하여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
됩니다.DateTimeFormatter
됩니다.DateTimeFormatter
지정한 날짜 문자열을 해석합니다. OOTB(Out-Of-The-Box)를 할 수 .DateTimeFormatter.BASIC_ISO_DATE
해석할 수 있습니다.
데모:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.parse("20140218", DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(date);
// In case you need an instance of LocalDateTime
LocalDateTime ldt = date.atTime(LocalTime.MIN);
System.out.println(ldt);
}
}
출력:
2014-02-18
2014-02-18T00:00
Trail: Date Time에서 최신 Date-Time* API에 대해 자세히 알아보십시오.
* Android 프로젝트에 종사하고 있으며, Android API 레벨이 Java-8과 호환되지 않는 경우, 디서깅을 통해 이용 가능한 Java 8+ API를 확인하십시오.Android 8.0 Oreo는 이미 에 대한 지원을 제공하고 있습니다.사용 방법에 대해서는, 이 회답과 이 회답을 확인해 주세요.java.time
JDBC API
이 정도면 잘 동작합니다.
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
DateTimeFormatter format = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.parseDefaulting(ChronoField.MILLI_OF_SECOND, 0)
.toFormatter();
효과가 있다
단순히 포맷(시간이 있는지 여부에 관계없이)을 취하여 LocalDateTime으로 해석하는 경우 다음을 수행할 수 있습니다.
LocalDateTime parseDateTime(String dateTime, DateTimeFormatter fmt) {
return fmt.parse(dateTime, t -> {
LocalDate date = t.query(TemporalQueries.localDate());
LocalTime time = t.query(TemporalQueries.localTime());
return LocalDateTime.of(date, time != null ? time : LocalTime.MIDNIGHT);
});
}
커스텀 Spark UDF의 파라미터로 날짜/시간 패턴을 받고 있었기 때문에 이것이 필요했습니다.
이것을 사용해 보세요.
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy");
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);
원하는 형식을 추가할 수 있습니다.난 괜찮아!
입력 문자열에 연도가 없기 때문에 이 문제가 발생하게 되었습니다.
문자열: " " " 입니다.Tuesday, June 8 at 10:00 PM
"포메터:DateTimeFormatter.ofPattern("EEEE, MMMM d 'at' h:mm a", Locale.US);
연도를 알고 있었으므로 다음과 같이 추가했습니다.
문자열: " " " 입니다.Tuesday, June 8 at 6:30 PM 2021
"포메터:DateTimeFormatter.ofPattern("EEEE, MMMM d 'at' h:mm a uuuu", Locale.US);
언급URL : https://stackoverflow.com/questions/27454025/unable-to-obtain-localdatetime-from-temporalaccessor-when-parsing-localdatetime
'programing' 카테고리의 다른 글
슈퍼클래스에서 서브클래스로의 명시적 캐스팅 (0) | 2022.07.27 |
---|---|
Vue에서 메서드를 호출하는 동안 괄호 (0) | 2022.07.27 |
C 표준 라이브러리의 어떤 기능이 일반적으로 나쁜 관행을 장려합니까? (0) | 2022.07.27 |
#의존관계추적도구 (0) | 2022.07.27 |
Java 및 Android 개발에서 WeakReference를 사용하는 방법 (0) | 2022.07.27 |