2013-05-09 3 views
4

시간대 정보와 함께 제공되는 날짜를 구문 분석합니다 (예 : 1/7/2008 11:00:00 AM -0700). -0700은 현재 캘리포니아에있는 현재 시간 오프셋에 해당합니다. 현재는 PDT입니다. 만약 내가 그것을 분석하고 함께 표시 :날짜를 파싱 할 때 표준 시간대를 유지하는 방법은 무엇입니까?

org.joda.time.format.DateTimeFormat.forPattern("M/d/yyyy hh:mm:ss a Z") 
    .parseDateTime("1/7/2008 11:00:00 AM -0700").toString() 

내가 얻을 : 2008-01-07T10:00:00.000-08:00. 10am -0800 = 11 am -0700과 같이 "올바른"것이지만 입력 한 시간과 동일한 시간 오프셋 (Z 부분)을 유지하기 위해 반환 된 날짜를 어떻게 얻을 수 있습니까?

보조 노트로 java.text.SimpleDateFormat을 사용하면 비슷한 결과가 나타납니다. new SimpleDateFormat("M/d/yyyy hh:mm:ss a Z").parse("1/7/2008 11:00:00 AM -0700").toString()Mon Jan 07 10:00:00 PST 2008이고 PST는 -0800이며 우리는 현재 PDT 상태입니다.

답변

4

제공하신 날짜는 1 월로, 이 아니며은 낮 시간대입니다. 따라서 -0800 오프셋은 태평양 시간대에 해당하는 시간을 의미하는 경우 정확합니다.

하지만 당신은 America/Los_Angeles 같은 시간대 ID를 지정하지 않은, 그래서 왜 JodaTime이 가정을하고있다?

대답은 DateTimeFormatter 클래스 the documentation에서 찾을 수 있습니다

기본이되는 프린터/파서 정확히 로 장식 수정 중 하나를 사용하여 필요한 행동을 변경할 수 있습니다 :

withLocale(Locale)을 -
withZone(DateTimeZone) - 지정된 시간대를 사용하는 새 포맷터를 반환합니다.
withChronology(Chronology) - r 해석 된 시간대가
withPivotYear()를 오프셋 (offset)를 돌려줍니다 새로운 포매터를 반환 - - 지정된 연대기
withOffsetParsed()을 사용하는 새로운 포맷이 eturns
withDefaultYear() 지정된 피벗 올해 새로운 포매터를 반환 - 지정된 기본 올해 새로운 포매터를 반환 DateTimeFormatter.forPattern() 방법

The documentation 말한다 :

형식은 로케일 특정 출력이 포함될 수 WI 포맷터의 로케일을 변경할 때 변경됩니다. 로캘을 전환하려면 DateTimeFormatter.withLocale (Locale)을 호출하십시오.

org.joda.time.format.DateTimeFormat.forPattern("M/d/yyyy hh:mm:ss a Z") 
     .withOffsetParsed() 
     .parseDateTime("1/7/2008 11:00:00 AM -0700").toString() 

당신이 정확히 무엇 인 .withOffsetParsed()의 행동 these docs를 참조하십시오 : 특정 로케일이나 시간대를 사용하지 않기 때문에

, 나는 다음과 같은 사용한다고 생각 묻고.