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()
다른 답변과 비교하면 다음과 같은 이점이 있습니다.
- 고객이 GMT로 날짜를 보내도록 요구하지 않아도됩니다.
- 다음을 사용하여 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
/ .Calendar
및 java.text.SimpleDateFormat
클래스는 Java 8 이상에 내장 된 java.time 프레임 워크로 대체되었습니다. 튜토리얼을 참조하십시오 . 구식 수업 은 잘못 설계되고 혼란스럽고 번거로운 것으로 입증되었으므로 피하십시오 .
구 클래스에서 열악한 디자인의 일부는 당신을 물었습니다. 여기서 toString
메소드는 실제로 UTC (GMT) 인 날짜-시간 값의 텍스트 표현을 생성 할 때 JVM의 현재 기본 시간대를 적용합니다. 고의적이지만 혼란 스럽습니다.
java.time 클래스는 날짜-시간 값의 텍스트 표현을 구문 분석 / 생성 할 때 기본적으로 ISO 8601 형식을 사용합니다. 따라서 구문 분석 패턴을 지정할 필요가 없습니다.
Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );
필요에 따라 시간대 를 적용 하여 ZonedDateTime
객체 를 생성 할 수 있습니다 .
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );
답변
그리고 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 형식 중 하나를 나타냅니다.