자바 캘린더를 사용하여 자정 (GMT)에 날짜를 만든 다음, 현지 시간대로 변경하여 요청한 시간이 1:00 (GMT + 1). 다음 코드는 작동합니다. 2 개의 성공적인 주장.자바 캘린더 시간대 변경이 예상대로 작동하지 않습니다.
TimeZone TIMEZONE_GMT = TimeZone.getTimeZone("GMT");
TimeZone TIMEZONE_LOCAL = TimeZone.getDefault(); // GMT + 1
private Calendar getMidnightGmtCalendarWithLocalTimezone() {
Calendar calendar = Calendar.getInstance(Locale.GERMAN);
calendar.set(2017, Calendar.JANUARY, 1, 0, 0, 0);
calendar.setTimeZone(TIMEZONE_GMT); // Probably not required
assertEquals(0, calendar.get(Calendar.HOUR_OF_DAY)); // Assert 1
// Log.i("TAG", "" + calendar.get(Calendar.HOUR_OF_DAY));
calendar.setTimeZone(TIMEZONE_LOCAL);
assertEquals(1, calendar.get(Calendar.HOUR_OF_DAY)); // Assert 2
return calendar;
}
이제 첫 번째 어설 션을 삭제하고 변경 사항을 기대하지 않습니다. 현실 : 2 단언은 이제 실패합니다! 저는 .get()의 구현을 이해하려고 노력했으며 분명히 시간도 계산하기 때문에 값을 수집하는 것이 아닙니다. 아직도 제 2 주장이 실패하는 이유를 모르겠습니다. 왜 이런 일이 않습니다
제 2 어설 션 (! 어설) 단지 문제가 아니라, Calendar.get (에서 발생해야하고,하지)
그래서 첫 번째 질문에 나는 로그 행의 주석을 해제하면 다시 성공? 두 번째 질문 : Timezone GMT의 자정에 시간을 설정 한 경우 로컬 표준 시간대가있는 Calendar 인스턴스가 있는지 어떻게 확인할 수 있습니까?
EDIT (? 즉, 어떻게 제대로 시간대를 변환 할 수 있습니다) : 나는 안드로이드에 사용하고, 그래서 Java8을 사용할 수 없습니다. Joda 시간 (아래에 제안 된대로)은 훌륭한 대안이며, 나는 그것에 대해 확실히 살펴볼 것입니다. 그러나, 내 질문에 대한 대답으로 나는 Java7 Calendar와 어떻게 작동하는지 알고 싶다. 왜냐하면 나는 그 코드에 잠시 묶여 있기 때문이다.
JDK 8을 사용하는 경우 캘린더를 포기하고 새로운 java.time 패키지를 사용하는 것이 좋습니다. 지원 수명이 끝나지 않은 유일한 JDK 일 것입니다. – duffymo
@duffymo 나는 왜'Calendar' 클래스의 사용을 포기해야하는지에 대한 권위있는 설명을 제공 할 수 있습니까? – Andremoniy
신뢰할 수 있습니까? java.util.Calendar는 JDK 1.0의 빈티지입니다. 그것은 처음부터 그것이 뒤죽박죽이고 사용하기가 어렵다는 것을 인정 받았다. (IBM이 작성, 올바르게 회신 한 경우) JODA는 이러한 오류를 해결하기 위해 개발되었습니다. 오라클이 성공적으로 JDK 8을 java.time 패키지로 접어 넣었습니다. 캘린더는 20 년 넘게 실패한 것입니다. 그것은 거대한 개선으로 인정 된 것으로 대체되었습니다. 나는 역사에 근거한 권위를 주장한다. 그게 당신에게 충분합니까? – duffymo