'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 프로젝트에 의해 확장됩니다.튜토리얼을 참조해 주세요.
Instant
java.time의 class는 UTC 시간대의 타임라인상의 시간을 나타냅니다.
Z
것은 ""를 의미합니다.Zulu
은 의 which 의 약자이다.UTC
은 직접 할 수 Instant
formatter.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 API의 Date 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 클래스가 포함되어 있습니다.
다만, 해석하기 전에, 후행의 「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
'programing' 카테고리의 다른 글
MySQL에서 열과 테이블 이름은 대소문자를 구분합니까? (0) | 2022.11.20 |
---|---|
PyLint "가져올 수 없습니다" 오류 - PYTONPATH를 설정하는 방법 (0) | 2022.11.20 |
사전의 값을 기준으로 사전 목록을 정렬하려면 어떻게 해야 합니까? (0) | 2022.11.20 |
MySQL에서 열 업데이트 (0) | 2022.11.19 |
DISPLAY가 정의되지 않은 경우 matplotlib를 사용하여 PNG 생성 (0) | 2022.11.19 |