Получить историческую локальную дату и время из времени UTC после изменения правил перехода на летнее время - PullRequest
0 голосов
/ 16 октября 2018

Допустим, я использую Oracle SGBD (RDBMS) и Java 8.

У меня есть хронологические даты, хранящиеся в часовом поясе UTC, но мои приложения отображают только локальные даты, и мои статистические вычисления также применяются только к локальнымdatetimes.

Теперь, скажем, правила DST в Европе меняются, как запланировано .

Какой самый простой способ сохранить работоспособность моего приложения и статистики?

Что я читал до сих пор, так это то, что есть часовые пояса, связанные с правилами DST в Oracle и Java , но они не получают автоматические обновления.Более того, я хотел бы сохранить правила до и после изменений, а не просто обновить правила, так как мне нужна историческая статистика, поэтому мне понадобится часовой пояс «Европа / Париж до перемен» и «Европа / Париж после».изменить часовой пояс, или, лучше сказать, часовой пояс, связанный с историей правил, применяющих себя по мере необходимости.

Кроме того, даже если бы были некоторые удобные способы сделать это в Java, он все равно должен быть исправлен в Oracle, чтобы охватитьвсе варианты использования.

Вот одно из соответствующих исторических изменений правил в Чикаго.Летнее время заканчивается в последнее воскресенье сентября до 1954 года, затем в последнее воскресенье октября с 1955 года (до следующего изменения правила):

Начало перехода на летнее время (Clock Forward) -> Окончание перехода на летнее время (Clock Backward)
1953Диманш 26 Аврил, 02 ч 00 -> Диманш 27 сентября, 02 ч 00
1954 Диманш 25 Аврил, 02 ч 00 -> Диманш 26 сентября, 02 ч 00
1955 Диманш 24 Аврил, 02 ч 00 -> Диманш30 октября, 02 ч 00
1956, dimanche 29 аврил, 02 ч 00 -> Диманш 28 октября, 02 ч 00

PS: Я знаю о Историческая база данных часовых поясов IANA , но, пожалуйста, покажите, как практически использовать его для Oracle SGBD и Java, если вы уже сделали это.

PPS: Любой совет о том, что было бы лучше, чем «UTC», решить эту проблему в будущей базе данных, такжеприветствуется.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Java или Oracle будут применять правильные правила для любой даты UTC автоматически - при условии, что у вас, конечно, самые последние файлы данных о часовых поясах.

Поскольку вы спрашивали о подходе Oracle (SGBD / RDBMS) и упоминалиЧикаго, довольно просто сгенерировать выборочные даты, когда часы изменились по другим правилам, и увидеть, что изменение применяется в правильные даты (по сравнению с примером изменения правила, добавленным к вопросу, и https://www.timeanddate.com/time/zone/usa/chicago).

alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS TZH:TZM';

with t (utc) as (
            select timestamp '1954-04-25 07:59:59 UTC' from dual
  union all select timestamp '1954-04-25 08:00:00 UTC' from dual
  union all select timestamp '1954-09-26 06:59:59 UTC' from dual
  union all select timestamp '1954-09-27 07:00:00 UTC' from dual
  --
  union all select timestamp '1955-04-24 07:59:59 UTC' from dual
  union all select timestamp '1955-04-24 08:00:00 UTC' from dual
  union all select timestamp '1955-10-30 06:59:59 UTC' from dual
  union all select timestamp '1955-10-30 07:00:00 UTC' from dual
  --
  union all select timestamp '1974-01-06 07:59:59 UTC' from dual
  union all select timestamp '1974-01-06 08:00:00 UTC' from dual
  union all select timestamp '1974-10-27 06:59:59 UTC' from dual
  union all select timestamp '1974-10-27 07:00:00 UTC' from dual
  --
  union all select timestamp '1975-02-23 07:59:59 UTC' from dual
  union all select timestamp '1975-02-23 08:00:00 UTC' from dual
  union all select timestamp '1975-10-26 06:59:59 UTC' from dual
  union all select timestamp '1975-10-26 07:00:00 UTC' from dual
  --
  union all select timestamp '1987-04-05 07:59:59 UTC' from dual
  union all select timestamp '1987-04-05 08:00:00 UTC' from dual
  union all select timestamp '1987-10-25 06:59:59 UTC' from dual
  union all select timestamp '1987-10-25 07:00:00 UTC' from dual
  --
  union all select timestamp '2007-03-11 07:59:59 UTC' from dual
  union all select timestamp '2007-03-11 08:00:00 UTC' from dual
  union all select timestamp '2007-11-04 06:59:59 UTC' from dual
  union all select timestamp '2007-11-04 07:00:00 UTC' from dual
)
select utc,
  utc at time zone 'America/Chicago' as chicago
from t;

, который дает вам:

UTC                        CHICAGO                   
-------------------------- --------------------------
1954-04-25 07:59:59 +00:00 1954-04-25 01:59:59 -06:00
1954-04-25 08:00:00 +00:00 1954-04-25 03:00:00 -05:00
1954-09-26 06:59:59 +00:00 1954-09-26 01:59:59 -05:00
1954-09-27 07:00:00 +00:00 1954-09-27 01:00:00 -06:00
1955-04-24 07:59:59 +00:00 1955-04-24 01:59:59 -06:00
1955-04-24 08:00:00 +00:00 1955-04-24 03:00:00 -05:00
1955-10-30 06:59:59 +00:00 1955-10-30 01:59:59 -05:00
1955-10-30 07:00:00 +00:00 1955-10-30 01:00:00 -06:00
1974-01-06 07:59:59 +00:00 1974-01-06 01:59:59 -06:00
1974-01-06 08:00:00 +00:00 1974-01-06 03:00:00 -05:00
1974-10-27 06:59:59 +00:00 1974-10-27 01:59:59 -05:00
1974-10-27 07:00:00 +00:00 1974-10-27 01:00:00 -06:00
1975-02-23 07:59:59 +00:00 1975-02-23 01:59:59 -06:00
1975-02-23 08:00:00 +00:00 1975-02-23 03:00:00 -05:00
1975-10-26 06:59:59 +00:00 1975-10-26 01:59:59 -05:00
1975-10-26 07:00:00 +00:00 1975-10-26 01:00:00 -06:00
1987-04-05 07:59:59 +00:00 1987-04-05 01:59:59 -06:00
1987-04-05 08:00:00 +00:00 1987-04-05 03:00:00 -05:00
1987-10-25 06:59:59 +00:00 1987-10-25 01:59:59 -05:00
1987-10-25 07:00:00 +00:00 1987-10-25 01:00:00 -06:00
2007-03-11 07:59:59 +00:00 2007-03-11 01:59:59 -06:00
2007-03-11 08:00:00 +00:00 2007-03-11 03:00:00 -05:00
2007-11-04 06:59:59 +00:00 2007-11-04 01:59:59 -05:00
2007-11-04 07:00:00 +00:00 2007-11-04 01:00:00 -06:00

Вы можете увидеть, какую версию файла данных о часовом поясе вы используете, запросив представление v$timezone_file или в последних версиях представление database_properties.

Подробнее о версиях и исправлениях файлов часовых поясов Oracle можно прочитать в Документ поддержки Oracle 412160.1 (Обновленные переходы DST и новые часовые пояса в исправлениях файлов часовых поясов Oracle RDBMS и OJVM) .

В частности, посмотрите на раздел J, «Список обновленных часовых поясов в обновлениях DST СУБД», в котором говорится:

Все времяОбновления файлов зон являются накопительными, то есть в более новом патче СУРБД DST есть все изменения предыдущих обновлений.
...
В списке ниже перечислены часовые пояса, которые обновляются в версии файла часового пояса.Также указан первый год изменений правил часового пояса для этого часового пояса и последний год (если применимо).

, поэтому в нем также указаны исторические даты.

0 голосов
/ 16 октября 2018

С https://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html:

В этой таблице показано, какая версия данных о часовых поясах включена в различные выпуски программного обеспечения Java Development Kit (JDK) и инструмента TZUpdater.Дополнительная информация о содержимом выпусков данных о часовых поясах содержится в соответствующем запросе на усовершенствование (RFE) для этого выпуска.Если в выпуск данных о часовых поясах включено значительное изменение часового пояса, это описано в последнем столбце.

Последний выпуск TZdata можно найти на странице IANA TZdata .

После выпуска TZUpdater v2.0 пользователи теперь могут обновлять версию tzdata в своих JDK / JRE, используя данные, полученные непосредственно из выпусков IANA tzdata.Обратитесь к TZUpdater README для получения более подробной информации.

Если вы хотите получать информацию об обновлениях данных часовых поясов на платформе Java SE и в инструменте TZUpdater, как только они происходят, подпишитесь на RSS-версию версии данных часовых поясов.

Поэтому, если вам нужны самые последние данные о часовом поясе, обновите информацию о часовом поясе Java с помощью инструмента TZUpdater .

Обновлениеот Алекса Пула в комментарии :

Oracle / Java будет применять соответствующие действующие правила в отношении даты UTC, которую вы пытаетесь преобразовать в определенный часовой пояс.Вам не нужно явно ничего делать - вам просто нужна последняя версия текущих + исторических правил

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