Я использую календарь Java для создания какой-либо даты в полночь (GMT), а затем измените часовой пояс на мой местный часовой пояс, чтобы удостовериться, что запрошенное время будет 1:00 (GMT + 1). Код ниже работает, вкл. 2 успешных утверждения.Изменение часового пояса Java не работает должным образом
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;
}
Теперь я удаляю первое утверждение, и я ожидаю, что ничего не изменится. Реальность: второе утверждение теперь терпит неудачу! Я попытался понять реализацию .get(), и, по-видимому, он также вычисляет некоторое время, поэтому он не просто собирает значение. Тем не менее, я не понимаю, почему мое второе утверждение терпит неудачу.
2-й утверждают преуспевает снова, когда я раскомментировать строки лога (только, чтобы быть уверенным, что проблема возникает из-за calendar.get(), а не Assert!)
Итак первый вопрос: почему это происходит? Второй вопрос: как я могу убедиться, что у меня есть экземпляр календаря с локальным часовым поясом, когда я установил время в полночь для Timezone GMT? (Другими словами, как я правильно конвертировать часовых поясов?)
EDIT: Я использую это на Android, поэтому не может использовать Java8. Время Джоды (как предлагается ниже) - отличная альтернатива, и я обязательно буду в этом разбираться. Однако, как ответ на мой вопрос, я хотел бы знать, КАК это работает с календарем Java7, потому что я привязан к этому коду на данный момент.
Я бы рекомендовал отказаться от Календаря и попробовать новый пакет java.time, если вы на JDK 8. Вы должны быть - это единственный JDK, который не прошел свой срок службы поддержки. – duffymo
@duffymo Я полностью согласен с вами, просто интересно, не могли бы вы дать какое-либо авторитетное описание о том, почему * использование класса 'Calendar' должно быть отменено? – Andremoniy
Авторитетный? java.util.Calendar - это JDK 1.0 vintage. С самого начала было признано, что оно запутано и сложно использовать. (Написано IBM, если я правильно помню.) JODA была разработана для устранения этих недостатков. Это было настолько успешным, что Oracle свернула его в JDK 8 как пакет java.time. Календарь - это неудача> 20 лет. Он был заменен чем-то признанным как огромное улучшение. Я требую авторитет, основанный на истории. Это достаточно хорошо для вас? – duffymo