Java SimpleDateFormat (“yyyy-MM-dd'T'HH : mm : ss'Z '”)은 표준 시간대를 IST로 제공합니다.


148

SimpleDateFormat 생성자가 있습니다.

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")

나는 문자열을 파싱하고있다. "2013-09-29T18:46:19Z".

Z는 GMT/UTC시간대를 나타냅니다 . 그러나 console 에서이 날짜를 인쇄하면 반환 된 날짜의 IST timezne이 인쇄됩니다.

이제 내 질문은 내 출력이 올바른지 아닌지에 대한 것입니다.


3
예, 그것이 'Z'를 나타내는 것입니다. Z- 시간대
Woody

5
Z = 줄루어 시간 => GMT + 0, 당신은 분명 역할을하지 않은 국가)
MushyPeas

답변:


251

시간대를 Z날짜 / 시간 끝에 추가하도록 시간대를 설정하지 않았 으므로 GMT 날짜 / 시간처럼 보이지만 값은 변경되지 않습니다.

시간대를 GMT로 설정하면 정확합니다.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

3
Z가없는 날짜가 2012-12-06T06 : 00 : 00 인 경우 GMT를 나타 냅니까?
binarygiant

3
@binarygiant 보낸 사람에게 물어봐야합니다. 발신자의 현지 시간 일 수 있습니다.
Peter Lawrey

2
시간대는 "UTC"
Prashanth

2
다른 라이브러리에 대해 너무 많은 장소에 시간대를 설정하고 기계 / 노트북 시간대와의 충돌을 피하는 대신 user.timezone 시스템 특성을 설정하여 JVM의 기본 시간대를 항상 설정해야합니다. java -Duser.timezone = GMT ...
kisna

100

'T''Z'상수로 여기 간주됩니다. Z따옴표없이 전달해야 합니다. 또한 입력 문자열에 시간대를 지정해야합니다.

예 : 2013-09-29T18:46:19-0700 그리고 형식"yyyy-MM-dd'T'HH:mm:ssZ"


Subir, 답장을 보내 주셔서 감사합니다. 입력 문자열에 "0700"이 추가되었습니다.
Pradip Borde

-0700시간대입니다 : -7 : 00 시간
Subir Kumar Sao

12
-07 시가 아닌 -0700시 다음과 같습니다. yyyy-MM-dd'T'HH : mm : ss.SSSXXX
Tastybrownies

48

ISO 8601 문자열에서 Java Date Object로

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013

설정하지 않으면 TimeZone.getTimeZone("GMT")출력됩니다Sun Sep 29 18:46:19 CST 2013

Java Date Object에서 ISO 8601 문자열로

그리고 Date객체를 ISO 8601 표준 ( yyyy-MM-dd'T'HH:mm:ss'Z') 으로 변환 하려면 다음 코드를 사용하십시오.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));           
System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z

' 'Z yyyy-MM-dd'T'HH:mm:ssZ인쇄 가 없으면2015-01-22T03:41:02+0000


2
"2018-05-01T18 : 30 : 00.000Z"파싱 할 날짜 : 그것은 나에게 java.text.ParseException을 제공 @AZ_을
Mansuu ....

41

Date의 ' 표준 'JSON 표현 을 처리 하려면 다음 패턴을 사용하는 것이 좋습니다 "yyyy-MM-dd'T'HH:mm:ssX".

X끝에 유의하십시오 . ISO 8601 표준의 시간대를 처리 하며 ISO 8601은 Javascript 에서이 문장을 생성하는 것과 정확히 일치합니다.new Date().toJSON()

다른 답변과 비교하면 다음과 같은 이점이 있습니다.

  1. 고객이 GMT로 날짜를 보내도록 요구하지 않아도됩니다.
  2. 다음을 사용하여 Date 객체를 GMT로 명시 적으로 변환 할 필요는 없습니다. sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

1
내가 사용하고 play의 자동 바인딩 형태, 사용의 @Format.DateTime주석을. Z에 끝이있는 기본 패턴 사용 이 올바르지 않은 것 같습니다. 로 변경 X하면 작동합니다. 많은 감사
transang

날짜가 "-0500"과 같은 RFC822 호환 방식으로 시간대를 지정하면 제대로 작동합니다. 그러나 "2013-07-15T10 : 22 : 17-05 : 00"(또한 유효한 ISO8601 TZ)과 같은 날짜에서는이 기능이 중단됩니다. 이 경우 "yyyy-MM-dd'T'HH : mm : ssXXX"를 사용해야합니다.
Lambart

23

tl; dr

다른 답변은 Java 8부터 오래되었습니다.

Instant                           // Represent a moment in UTC. 
.parse( "2013-09-29T18:46:19Z" )  // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces “Zulu”.
.atZone(                          // Adjust from UTC to a time zone. 
    ZoneId.of( "Asia/Kolkata" )
)                                 // Returns a `ZonedDateTime` object. 

ISO 8601

문자열 형식은 ISO 8601 표준 을 준수 합니다. 이 표준은 다양한 날짜-시간 값을 텍스트로 표시하기위한 적절한 형식을 정의합니다.

java.time

이전 java.util.Date/ .Calendarjava.text.SimpleDateFormat클래스는 Java 8 이상에 내장 된 java.time 프레임 워크로 대체되었습니다. 튜토리얼을 참조하십시오 . 구식 수업 은 잘못 설계되고 혼란스럽고 번거로운 것으로 입증되었으므로 피하십시오 .

구 클래스에서 열악한 디자인의 일부는 당신을 물었습니다. 여기서 toString메소드는 실제로 UTC (GMT) 인 날짜-시간 값의 텍스트 표현을 생성 할 때 JVM의 현재 기본 시간대를 적용합니다. 고의적이지만 혼란 스럽습니다.

java.time 클래스는 날짜-시간 값의 텍스트 표현을 구문 분석 / 생성 할 때 기본적으로 ISO 8601 형식을 사용합니다. 따라서 구문 분석 패턴을 지정할 필요가 없습니다.

Instant있는 타임 라인에 순간 UTC .

Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );

필요에 따라 시간대 를 적용 하여 ZonedDateTime객체 를 생성 할 수 있습니다 .

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );

최신 및 기존 Java의 날짜-시간 유형 테이블


22

그리고 java8로 갈 수있는 옵션이 없다면 'yyyy-MM-dd'T'HH : mm : ssX XX '를 사용하는 것이 좋습니다. 이것은 다시 올바르게 구문 분석되므로 (X가 하나 뿐이지 만 그렇지 않을 수도 있습니다). .. 파싱 기능에 따라 다름)

X 생성 : +01

XXX에서 생성 : +01 : 00


0

Java 8의 경우 다음java.time.format.DateTimeFormatter 과 같이 오타 가능성을 줄이기 위해 내장 기능 을 사용할 수 있습니다 .

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

ISO_ZONED_DATE_TIME은 2011-12-03T10:15:30+01:00[Europe/Paris]Oracle 링크에서 제공하는 번들 표준 DateTime 형식 중 하나를 나타냅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.