programing

'Z' 리터럴이 있는 SimpleDateFormat 구문 분석 날짜

goodsources 2022. 11. 20. 12:20
반응형

'Z' 리터럴이 있는 SimpleDateFormat 구문 분석 날짜

다음과 같은 날짜를 해석하려고 합니다.

2010-04-05T17:16:00Z

이는 http://www.ietf.org/rfc/rfc3339.txt에 따라 유효한 날짜입니다.'Z' 문자(따옴표)는 "UTC가 지정된 시간 동안 우선되는 기준점임을 나타냅니다."

SimpleDateFormat 및 다음 패턴을 사용하여 해석하려고 하면 다음과 같습니다.

yyyy-MM-dd'T'HH:mm:ss

2010년 4월 5일 (월)17:16:00 EDT로 해석됩니다.


SimpleDateFormat는, 다음의할 수 .

yyyy-MM-dd'T'HH:mm:ssz
yyyy-MM-dd'T'HH:mm:ssZ

타임존을 명시적으로 설정하여SimpleDateFormat 놓치고 있는 이 있나요?가가 놓친 ?? ???체체날 날석 ?? ????

Java가 ISO 날짜를 올바르게 구문 분석하지 않습니다.

McKenzie의 대답과 비슷합니다.

만 하면 돼요.Z를 참조해 주세요.

코드

String string = "2013-03-05T18:05:05.000Z";
String defaultTimezone = TimeZone.getDefault().getID();
Date date = (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")).parse(string.replaceAll("Z$", "+0000"));

System.out.println("string: " + string);
System.out.println("defaultTimezone: " + defaultTimezone);
System.out.println("date: " + (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")).format(date));

결과

string: 2013-03-05T18:05:05.000Z
defaultTimezone: America/New_York
date: 2013-03-05T13:05:05.000-0500

해석하는 날짜는 ISO 8601 형식입니다.

은 Java 7로 있어야 합니다.yyyy-MM-dd'T'HH:mm:ssX

dr;dr

Instant.parse ( "2010-04-05T17:16:00Z" )

ISO 8601 표준

사용하시는 문자열은 ISO 8601 표준(상기 RFC 3339가 프로파일)에 준거하고 있습니다.

java.util을 피합니다.날짜.

java.util.날짜 및.Java에 번들된 캘린더 클래스는 귀찮기로 악명 높습니다.그들을 피하세요.

대신 Joda-Time 라이브러리 또는 Java 8의 새로운 java.time 패키지를 사용합니다.둘 다 날짜 값의 문자열 표현을 해석 및 생성하기 위한 기본값으로 ISO 8601을 사용합니다.

java.time

Java 8 이후에 내장된 java.time 프레임워크는 문제가 되는 오래된 java.util을 대체합니다.Date/.Calendar 클래스이 새로운 클래스는 매우 성공적인 Joda-Time 프레임워크에서 영감을 얻었으며, 그 후속작으로서 컨셉은 비슷하지만 재구축되었습니다.JSR 310에 의해 정의됩니다.ThreeTen-Extra 프로젝트에 의해 확장됩니다.튜토리얼을 참조해 주세요.

Instantjava.time의 class는 UTC 시간대의 타임라인상의 시간을 나타냅니다.

Z 것은 ""를 의미합니다.Zulu은 의 which 의 약자이다.UTC은 직접 할 수 Instantformatter.class를 가 없습니다.

String input = "2010-04-05T17:16:00Z";
Instant instant = Instant.parse ( input );

콘솔에 덤프합니다.

System.out.println ( "instant: " + instant );

즉석: 2010-04-05T17:16:00Z

여기서 표준 ZoneId시간대()를 적용하여 이 값을 로 조정할 수 있습니다. 스택 오버플로우를 검색하여 설명 및 예를 참조하십시오.

개체를 사용해야 하는 경우 static method 등 오래된 클래스에 추가된 새로운 변환 메서드를 호출하여 변환할 수 있습니다.

java.util.Date date = java.util.Date.from( instant );

조다 타임

Joda-Time 2.5의 예.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ):
DateTime dateTime = new DateTime( "2010-04-05T17:16:00Z", timeZone );

UTC로 변환합니다.

DateTime dateTimeUtc = dateTime.withZone( DateTimeZone.UTC );

java.util로 변환합니다.필요한 경우 날짜.

java.util.Date date = dateTime.toDate();

패턴에서 'z' 날짜-시간 구성요소가 포함된 것은 표준 시간대 형식이 일반 시간대 "표준"을 준수해야 함을 나타냅니다. 예를 들어 다음과 같습니다.Pacific Standard Time; PST; GMT-08:00

'Z'는 타임존이 RFC 822 표준 타임존에 준거하고 있음을 나타냅니다.-0800.

데이터형 변환기가 필요할 것 같은데...

@Test
public void testTimezoneIsGreenwichMeanTime() throws ParseException {
    final Calendar calendar = javax.xml.bind.DatatypeConverter.parseDateTime("2010-04-05T17:16:00Z");
    TestCase.assertEquals("gotten timezone", "GMT+00:00", calendar.getTimeZone().getID());
}

Java 7 APIDate and Time Patterns 테이블의 마지막 행에 따라

X 표준시 ISO 8601 표준시 -08; -0800; -08:00

ISO 8601 표준 시간대의 경우 다음을 사용해야 합니다.

  • (-08 또는 Z)의 경우 X,
  • XX(-0800 또는 Z)의 경우,
  • XXX(-08:00 또는 Z)의 경우;

따라서 "2010-04-05T17:16:00Z"를 해석하려면 "yyy-MM-dd'T" 중 하나를 사용합니다.HH:mm:ssX" 또는 "yyy-MM-dd'T"HH:mm:ssXX" 또는 "yyy-MM-dd'T"HH:mm:ssXX"선택합니다.

    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX").parse("2010-04-05T17:16:00Z"));
    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX").parse("2010-04-05T17:16:00Z"));
    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX").parse("2010-04-05T17:16:00Z"));

는 올바르게 인쇄됩니다.「 4월 5일 13:16:00 EDT 2010 」

'X'는 부분적인 초가 존재하지 않는 경우에만 작동합니다. 즉, SimpleDateFormat 패턴은

"yyy-MM-dd'T"HH:mm:ssX"

올바르게 해석하다

"2008-01-31T00:00:00Z"

그렇지만

"yyy-MM-dd'T"HH:mm:ss.SX"

해석하지 않음

"2008-01-31T00:00:00.000Z"

슬프지만 사실입니다.부분적인 초수를 가진 날짜 시간이 유효한 ISO 날짜가 아닌 것 같습니다.http://en.wikipedia.org/wiki/ISO_8601

Java 8에서는 미리 정의된 DateTimeFormatter를 사용합니다.ISO_DATE_TIME

 DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
 ZonedDateTime result = ZonedDateTime.parse("2010-04-05T17:16:00Z", formatter);

그게 제일 쉬운 방법인 것 같아

SimpleDateFormat에서 올바르게 구문 분석하려면 표준 시간대는 "GMT+00:00" 또는 0000과 같아야 합니다. Z를 이 구성으로 대체할 수 있습니다.

8은 java 8만 ZonedDateTime.parse("2010-04-05T17:16:00Z")

restlet 프로젝트에는 RFC 3339 날짜를 해석할 수 있는 InternetDateFormat 클래스가 포함되어 있습니다.

InternetDateFormat을 다시 시작

다만, 해석하기 전에, 후행의 「Z」를 「UTC」로 치환하는 것이 좋을지도 모릅니다.

또 하겠습니다.api-client-library구글에 의해

try {
    DateTime dateTime = DateTime.parseRfc3339(date);
    dateTime = new DateTime(new Date(dateTime.getValue()), TimeZone.getDefault());
    long timestamp = dateTime.getValue();  // get date in timestamp
    int timeZone = dateTime.getTimeZoneShift();  // get timezone offset
} catch (NumberFormatException e) {
    e.printStackTrace();
}

설치 가이드,
https://developers.google.com/api-client-library/java/google-api-java-client/setup#download

API 레퍼런스는 다음과 같습니다.
https://developers.google.com/api-client-library/java/google-http-java-client/reference/1.20.0/com/google/api/client/util/DateTime

소스 코드DateTime학급,
https://github.com/google/google-http-java-client/blob/master/google-http-client/src/main/java/com/google/api/client/util/DateTime.java

DateTime유닛 테스트,
https://github.com/google/google-http-java-client/blob/master/google-http-client/src/test/java/com/google/api/client/util/DateTimeTest.java#L121

JSR-310과 관련하여 또 다른 관심 프로젝트는 threetenbp일 수 있다.

JSR-310은 Java SE 8의 새로운 날짜와 시각 라이브러리를 제공합니다.이 프로젝트는 Java SE 6 및7의 백포트입니다.

Android 프로젝트에서 작업 중인 경우 ThreeTenABP 라이브러리를 체크하는 것이 좋습니다.

compile "com.jakewharton.threetenabp:threetenabp:${version}"

JSR-310은 Java 8에 java.time으로 포함되어 있습니다.* 패키지Java와 Android에서 문제가 있는 Date API와 Calendar API를 완전히 대체한 것입니다.JSR-310은 JSR의 제작자인 Stephen Colebourne에 의해 Java 6으로 역수출되었으며, 이 라이브러리는 JSR-310에서 채택되었습니다.

언급URL : https://stackoverflow.com/questions/2580925/simpledateformat-parsing-date-with-z-literal

반응형