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

SimpleDateFormat 생성자가 있습니다.

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

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

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

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



답변

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

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

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


답변

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

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


답변

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


답변

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"));

답변

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의 날짜-시간 유형 테이블


답변

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

X 생성 : +01

XXX에서 생성 : +01 : 00


답변

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 형식 중 하나를 나타냅니다.