В документации по 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 персистентности объектов по своему вкусу.С помощью внешнего ключа, который указывает правила часового пояса, используемые для соответствующих данных, вы можете быть уверены, что ваше приложение базы данных может сообщать исторически точное местное время.