Как вы обновляете TimeZone и Calendar после смены часового пояса? - PullRequest
2 голосов
/ 28 января 2012

Время от времени происходят изменения часовых поясов, я знаю, что каждый год в Великобритании ходят разговоры о том, что мы должны отказаться от GMT или использовать «двойное летнее время».

Когда происходят эти изменения, я предполагаю, что любые даты, полученные с помощью классов TimeZone или Calendar в старой версии Java, потенциально могут дать вам неверные данные. Если не считать простого обновления версии Java, есть ли способ обойти это, например? как постоянно обновляемый файл патча, который вы можете поместить в свое приложение?

Кроме того, исправляется ли проблема для Applets таким же образом - поскольку вы не можете непосредственно контролировать версию / обновление Java, на котором выполняется приложение?

Ответы [ 4 ]

1 голос
/ 29 января 2013

В документации по Java TimeZone и производным классам SimpleTimeZone говорится, что ...

Класс содержит смещение от GMT, называемое необработанным смещением, а также правила начала и окончания для расписания летнего времени.,Поскольку он содержит только отдельные значения для каждого из них, он не может обрабатывать исторические изменения в смещении от GMT и расписания перехода на летнее время, за исключением того, что метод setStartYear может указывать год начала действия расписания перехода на летнее время.

Это означает, что если ваше приложение не использует исторические даты / время, у вас не возникнет проблем, если объект TimeZone, который вы используете во время создания этих объектов, будет обновлен.

Однако ...

Если ваше приложение содержит какую-либо базу данных исторических дат / времени, то при вступлении в силу нового правила часового пояса ваше приложение будет ошибочно интерпретировать вашу историческую информацию и отображать неверные результаты, так какОбъект TimeZone, который он будет использовать, отличается от объекта TimeZone, который использовался во время создания ваших исторических данных.

Если вам важно поддерживать исторически точные даты / время (например, дляпример, платежные записи, чтобы идтиагентствам, которые имеют очень четко определенные параметры для определения права на выставление счетов), тогда вам нужно будет хранить не только вашу историческую информацию о дате / времени в вашей базе данных, но и информацию, которую можно использовать для воссоздания правил о часовых поясах, которые действовали в то времятакже.Существует несколько возможных решений.

Класс Java SimpleTimeZone имеет конструктор, который позволит вам создать объект TimeZone с одним набором правил для часовых поясов и летнего времени:

SimpleTimeZone (int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int endMonth, int endDay, int endDayOfWeek, int endTime, int dstSavings)

Создает временную зону SimpleTimeZone с заданной базовой зонойсмещение от GMT, идентификатор часового пояса и правила для начала и окончания летнего времени.

Итак, просто убедитесь, что вы храните всю информацию о дате / времени в своей базе данных как метки времени UTC.Мне нравится хранить временные метки в базах данных как «измененные юлианские числа дня», которые могут хранить календарные даты и время с точностью до миллисекунды в двойном размере.Измененные номера юлианских дней всегда определяются в UTC.Как бы то ни было, пока ваша информация находится в UTC, вы стандартны.

Затем вы можете создать таблицу всех аргументов, необходимых для создания объектов SimpleTimeZone, когда-либо используемых в вашей базе данных, или вы можете простосохраните все объекты, используемые вашей базой данных, с помощью API персистентности объектов по своему вкусу.С помощью внешнего ключа, который указывает правила часового пояса, используемые для соответствующих данных, вы можете быть уверены, что ваше приложение базы данных может сообщать исторически точное местное время.

1 голос
/ 28 января 2012

Лучшим решением является обновление до новейших JRE и JDK.

Если это невозможно по какой-либо причине, SUN предоставляет инструмент для обновления таблицы часовых поясов до последней. Вы можете найти TZUpdater здесь

0 голосов
/ 28 января 2012

Марк Родос прав, если что-то в часовом поясе было изменено (например, на моем летнем времени), это вернет даже неправильное время.Таким образом, конечные пользователи должны обновить свои JRE.

PS: дополнительно вы можете настроить утилиту обновления TimeZone для IBM JRE здесь http://www.ibm.com/developerworks/java/jdk/dst/jtzu.html

0 голосов
/ 28 января 2012

Ява дата считывает время системы. Это время обычно синхронизируется с сервером времени, поэтому, как правило, проблем не будет.

API часовых поясов рассчитывает переход на летнее время для вас.

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/TimeZone.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...