> Java > java지도 시간 > Java 8의 OffsetDateTime 클래스가 \' 0000\'과 같은 오프셋이 있는 ISO 8601 문자열을 구문 분석하는 데 어려움을 겪는 이유는 무엇입니까?

Java 8의 OffsetDateTime 클래스가 \' 0000\'과 같은 오프셋이 있는 ISO 8601 문자열을 구문 분석하는 데 어려움을 겪는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-31 07:10:01
원래의
492명이 탐색했습니다.

Why is Java 8's OffsetDateTime class struggling to parse ISO 8601 strings with offsets like

Java 8 Date API를 사용하여 ISO 8601 문자열을 구문 분석하는 어려움

ISO 8601 형식 문자열("2018- 02-13T10:20:12.120 0000") Java 8의 ZonedDateTime 클래스와 사전 정의된 형식 패턴을 사용하면 오프셋에 콜론이 누락되어 사용자에게 구문 분석 오류가 발생할 수 있습니다.

범인 : Java 8 버그

이 구문 분석 문제는 OffsetDateTime 클래스가 시와 분 사이에 콜론 없이 오프셋을 올바르게 구문 분석하지 못하게 하는 Java 8의 버그로 인해 발생합니다. 이 버그는 " 0000"과 같은 오프셋에 영향을 주지만 " 00:00"에는 영향을 미치지 않습니다.

버그가 수정될 때까지의 해결 방법:

(a ) 문자열 조작 해킹:

파싱하기 전에 입력 문자열을 변경하여 누락된 콜론을 추가하세요:

<code class="java">String input = "2018-02-13T10:20:12.120+0000".replace("+0000", "+00:00");
OffsetDateTime odt = OffsetDateTime.parse(input);</code>
로그인 후 복사

(b) 명시적 DateTimeFormatter:

구문 분석을 안내하기 위해 특정 패턴으로 DateTimeFormatter를 정의합니다.

<code class="java">String input = "2018-02-13T10:20:12.120+0000";
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX");
OffsetDateTime odt = OffsetDateTime.parse(input, f);</code>
로그인 후 복사

추가 개선 사항:

자세한 내용 적용 가능한 형식 지정 패턴을 활용하려면 DateTimeFormatterBuilder:

<code class="java">DateTimeFormatter f = DateTimeFormatterBuilder.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX")
                                         .appendOffset("+HH:MM", "Z")
                                         .toFormatter();
OffsetDateTime odt = OffsetDateTime.parse(input, f);</code>
로그인 후 복사

권장 사항:

구문 분석을 단순화하려면 오프셋에 항상 콜론이 포함되도록 하고 시간과 시간을 모두 포함해야 합니다. 분(0인 경우에도), 패딩 0(-5 대신 -05:00)을 사용합니다.

추가 참고 사항:

  1. UTC 값은 Instant를 사용합니다.
<code class="java">Instant instant = odt.toInstant();</code>
로그인 후 복사
  1. 특정 시간대의 벽시계 표현을 얻으려면:
<code class="java">ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime zdt = odt.atZoneSameInstant(z);</code>
로그인 후 복사
  1. 레거시를 피하세요. 날짜-시간 수업; 대신 java.time을 사용하세요.

위 내용은 Java 8의 OffsetDateTime 클래스가 \' 0000\'과 같은 오프셋이 있는 ISO 8601 문자열을 구문 분석하는 데 어려움을 겪는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿