2013-04-12 2 views
1

아래 코드를 실행하려고합니다. 나는 4 월 2 일 일요일부터 시작하여 5 월 3 일 2 일 오전 2시에 끝나는 dst로 시간대를 정의합니다.DST_OFFSET이 변경 될 때 변경되지 않습니다.

SimpleTimeZone st = new SimpleTimeZone(-18000000, "DSTTesting", Calendar.MARCH, 4, 1, 7200000, Calendar.MARCH, -1, 1, 7200000); 

    Calendar cal = Calendar.getInstance(st); 
    cal.set(2013, 0, 1, 0, 0, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    System.out.println("DST_OFFSET before subtracting hours : "+cal.get(Calendar.DST_OFFSET)); 
    cal.add(Calendar.HOUR, -2); 
    System.out.println("DST_OFFSET after subtracting hours : "+cal.get(Calendar.DST_OFFSET)); 

출력은 다음과 같습니다
DST_OFFSET 뺀 시간 전에 : 0
DST_OFFSET 시간을 뺀 후 : 3,600,000

내가 2013년 1월 오전 1시에서 2 시간 뺄 때 DST_OFFSET이 변경 이유를 확실하지. 이상적으로 2013 년 1 월 1 일과 2012 년 12 월 31 일 모두 두 개의 날짜가 내가 만든 TimeZone의 DST 기간 밖에 있으므로 DST_OFFSET의 값이 모두 같아야합니다.

답변

1

잘못된 생성자 인수가 있다고 생각합니다. 설명서 here을 참조하십시오. 당신은 "3 월 4"를 의미하는 경우에 당신은 요일 값에 대한 제로 지정해야,

Calendar.MARCH, 4, 1 

: 당신이 의미하는 경우

Calendar.MARCH, 4, 0 

당신의 시작 값을 지정하는 "3 월 4 일 이후의 첫 번째 일요일"일 경우 부정적인 요일 값을 지정해야합니다.

Calendar.MARCH, 4, -1 

지정한 종료 날짜가 확인됩니다. 그것은 :

Calendar.MARCH, -1, 1 

즉 "지난 3 월의 일요일"을 의미합니다.

이유는 정확히 DST가 이것 때문에 꺼져 있을지 모르겠지만 수정하고 차이가 있는지 확인하십시오.

또한 - Joda Time 라이브러리를 심각하게 고려해야합니다. 훨씬 더 신뢰할 수있는 결과를 얻게되며 모든 DST 규칙을 직접 구현할 필요가 없습니다.

UPDATE

주의 깊게 the documentation 읽기, 그것은 cal.get(Calendar.DST_OFFSET) 효과에 달력의 현재 날짜를 취하거나, 그냥 반환하면 오프셋 (offset) 일광 시간대와 관련된 것이 분명하지 않다. 시간대 구현 서브 클래스 가, 서머 타임의 스케줄의 역사적는 아마도 당신이 시도해야

을 변경 지원하는 경우

이 필드는이 Calendar의 시간대의 오프셋 값을 정확한 서머 반영으로 그것은 말로 있어요 이 대신에?

boolean dst = st.inDaylightTime(cal.getTime()); 

나는 여기서 추측하고있다. 나는 그것을 직접 테스트하지 않았다.

+0

답장을 보내 주셔서 감사합니다. – TeeJ

+0

3 월 넷째 주 일요일은 Calendar.MARCH, 21, -1로 작성되어야합니다. 이 변경을 수행 한 후에도 출력은 동일합니다. 시간을 빼면 DST_OFFSET이 0에서 3600000으로 변경됩니다. – TeeJ

+0

업데이트 된 답변에 게시 된 코드가 적합한 지 알려주세요. 감사. –

관련 문제