2017-05-17 1 views
-1

문자열 형식으로 클라이언트에 "2017-06-14T04:00:00-08:00"을 보내는 클라이언트가 있습니다. 우리는 JAVA 날짜 유형으로 변환해야합니다.문자열을 분석하여 시간대 오프셋을 그대로 유지

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); 
dateParsedFromString = formatter.parse("2017-06-14T04:00:00-08:00"); 

을 그러나 우리는이 구문 분석의 뒤의 오프셋 (offset)를 잃어 가고있다 :

우리는이 방법으로 분석된다. 우리가 문자열로 다시 변환 할 때 우리가보고있는 값 :

2017-06-14T08 : 00 : 00-04 : 난을 변경하지 않고 JAVA에 DateString에서 변환 할 수있는 방법 00

오프셋?

+0

가능한 복제 [파이썬 -0400 시간대 문자열로 날짜를 구문 분석하는 방법?] (http://stackoverflow.com/questions/1101508/how-to-parse-dates-with -0400-timezone-string-in-python) –

+4

@MarioSantini phyton에 대한 대답은 Java의 질문에 대한 dupplicate가 될 수 있습니까? – Jens

+0

@Jens 당신이 옳았 어, 미안 해요, 그냥 링크를 놓치지 마세요, 여기보세요 http://stackoverflow.com/questions/4203718/converting-string-to-date-with-timezone 자바 anser, 수 없습니다 그것이 대답으로 받아 들여지지 않는 것으로 플래그. –

답변

1

java.util.Date에는 표준 시간대 정보가 저장되지 않습니다.

시간대를 유지하려면 ZonedDateTime 또는 OffsetDateTime (Java 8 이상)을 사용하십시오.

날짜 문자열이 ISO 8601이므로 날짜 형식을 지정하지 않아도됩니다.

ZonedDateTime zdt = ZonedDateTime.parse("2017-06-14T04:00:00-08:00"); 
System.out.println(zdt); // prints: 2017-06-14T04:00-08:00 
OffsetDateTime odt = OffsetDateTime.parse("2017-06-14T04:00:00-08:00"); 
System.out.println(odt); // prints: 2017-06-14T04:00-08:00 
+0

'ZonedDateTime'이 기술적으로 작동하는 동안, 'OffsetDateTime'이 적절합니다. 표준 시간대는 특정 지역에서 사용 된 오프셋 변경 내역입니다. –

+0

@BasilBourque'-08 : 00'이 유효한 시간대이기 때문에'ZonedDateTime'을 사용하는 것이 완벽하게 유효합니다. 표준 시간대는 영역 오프셋의 상위 집합이거나 [[ZoneOffset'] (https://docs.oracle.com/javase/8/docs/api/java/time/ZoneOffset.html)은 하위 클래스 (제한)입니다. ZoneId '의 – Andreas

+0

그런데 왜 우리는 'OffsetDateTime' 클래스를 가지고 있습니까? 그리고, 아니요, '-08 : 00'은 시간대가 아닙니다. 'America/Los_Angeles'는 시간대입니다. 그 지역은 올해의 일부가 -08 : 00이고 다른 부분은 -07 : 00입니다. 시간 경과에 따른 오프셋, 과거 내역, 현재 순간 오프셋, 향후 계획된 오프셋 변경, 해당 한 지역의 오프셋 * 컬렉션은 시간대입니다. 따라서이 답변에서 'ZonedDateTime'을 사용하면 오해의 소지가 있고 혼란스럽고 입력 데이터에 적합하지 않습니다. 그렇지 않으면 좋은 답변 ZonedDateTime을 삭제하면. –

관련 문제