2013-09-05 4 views
1

Java에서 일부 파싱을 수행하고 있으며 이상한 동작이 발생했습니다.Java SimpleDateFormat 구문 분석 오류

String s = "Sun Aug 11 2013 11:00:00 -0700 (Pacific Daylight Time)" 

내가 지금처럼 날짜 객체로 구문 분석하려고 해요 :

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss Z (zzzz)"); 

나는 그때부터 결과 날짜 개체를 인쇄 다음과 같은

나는 날짜 문자열을 sdf.parse(s)과를 얻을 :

Sun Aug 11 12:00:00 CDT 2013 

을 내가, 중앙 시간대에서 오전는 말이 그래서 그것을 페이지 그러나 CDT는 -0500이므로 파싱 된 날짜는 12:00이 아닌 13:00이어야합니다.

시간대 정보의 중복 부분 중 하나를 제거하면 날짜가 올바르게 분석됩니다.

Sun Aug 11 13:00:00 CDT 2013 

이 동작은 일광 절약 시간 내에 날짜가 발생하는 것 같습니다 : 형식 "EEE MMM dd yyyy HH:mm:ss Z ('Pacific Daylight Time')" 또는 형식 정확한 날짜에 "EEE MMM dd yyyy HH:mm:ss '-0700' (zzzz)" 결과를 사용. 예를 들어, 12 월에 초기 날짜 형식으로 날짜를 구문 분석하면 올바른 결과를 얻을 수 있습니다.

저는 구문 분석하는 날짜의 형식을 다소 제한적으로 관리했으며 다양한 시간대에서 올 수있었습니다. 누구든지이 문제가 발생하기 전에, 날짜 문자열의 형식을 변경하지 않고 주위를 둘러 볼 수있는 방법이 있습니까? 표준 시간대 지정이 중복되어 있음을 알지만, 내가 알 수있는 한 정확하지 않습니다.

+0

이것은 불규칙하지 않으며,'SimpleDateFormat'은'Date'가 기본 Locale과 TimeZone에서 다른 시간대에있는'String'에서 반환되어야한다고 가정합니다. –

+0

흥미롭게도, 나는 Eastern Daylight Time에 있는데, 같은 코드를 써서 날짜를 인쇄했을 때, 나는'Sun Aug 11 13:00:00 EDT 2013'을 얻었다. – VGR

+0

그 두 시간대 부품은 실제로 중복되지는 않지만 오히려 서로 충돌한다고 생각합니다.이 경우 SimpleDateFormat에 예측할 수없는 동작이 나타날 것으로 예상됩니다. 'TimeZone.getTimeZone ("GMT-07 : 00")'과'TimeZone.getTimeZone ("US/Pacific")'에 의해 반환 된 값을 출력하여 충돌하는 이유를 확인하십시오. – VGR

답변

0

Java가 과거의 일광 절약 시간제 및 시간대 처리에서 버그가 발생 했음이 분명합니다. 어떤 Java 버전입니까?

Joda-Time에 주어진 날짜가 올바르게 처리되는지 확인해보십시오.

Joda가 도움이되지 않는 경우 하나만 정의되어있을 때 작동하므로 괄호 안에 설명이있는 시간대를 제거하려면 해당 날짜 문자열 중 일부를 사전 파싱해야합니다. 정말로 이상한!

관련 문제