Разница во времени от Oracle до JDBC - PullRequest
0 голосов
/ 22 октября 2018

Я сохранил dbtimezone в Oracle DB (12.2) как «-07: 00» и «America / Los_Angeles» и извлек столбец с «TIMESTAMP WITH LOCAL TIME ZONE», который дал мне разные значения.Это показывает разницу в 8 минут.Ниже приведены запросы.

ALTER DATABASE ORCL SET TIME_ZONE='America/Los_Angeles';

Завершение работы и запуск

Создайте пользователя и создайте таблицу с TIMESTAMP WITH LOCAL TIME ZONE

create table t_ts(id int, ts timestamp with local time zone, tst timestamp with time zone);
insert into t_ts values(1, timestamp '0912-02-29 02:02:10.089', timestamp '0912-02-29 02:02:10.089');

Я отправил запрос и получилстрока с использованием JDBC, и это дает мне:

ID: 1
Epoch time: -33381730189911
TS: 0912-02-29 01:10:10.089

Теперь я удаляю таблицу и пользователя, а затем я устанавливаю dbtimezone в '-07: 00' и делаю то же самое.Это дает мне другой результат.

ID: 1
Epoch time: -33381730669911
TS: 0912-02-29 01:02:10.089

У меня есть два вопроса:

1) Как отключить переход на летнее время при переносе меток времени с использованием JDBC. (Разница в один час заключается в том, чтоданное время подпадает под DST)

2) Почему разница во времени составляет 8 минут?

Версия JDBC:

Oracle 12.2.0.1.0 JDBC 4.2 compiled with javac 1.8.0_91 on Tue_Dec_13_06:08:31_PST_2016

Мой код JDBC ниже:

ResultSet rs=stmt.executeQuery("select * from t_ts");
while(rs.next()) {
   System.out.println("ID: " + rs.getInt("id"));
   Timestamp ts = rs.getTimestamp("ts");
   System.out.println("Epoch time: " + ts.getTime());
   System.out.println("TS: " + ts);
}

1 Ответ

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

Может быть, посмотрите на База данных часовых поясов IANA , которая также используется базой данных Oracle.

Для America/Los_Angeles вы видите эту запись:

От Пола Эггертта (2018-03-20): предложение Дауда оставило многие детали нерешенными, например, где проводить черты между часовыми поясами.Ключевым человеком, который заставил часовые пояса работать в США, был Уильям Фредерик Аллен - железнодорожный инженер, управляющий редактор Руководства для путешественников и секретарь General Time Convention, группы по железнодорожной стандартизации.Аллен провел месяцы в диалогах с научными и железнодорожными руководителями, разработал работоспособный план по созданию часовых поясов и представил его на Общем собрании времени 1883-04-11, заявив, что его план означал, что «местное время будет практически отменено» -плюс для железнодорожного планирования.К следующему соглашению 1883-10-11 почти все железные дороги согласились, и оно вступило в силу 1883-11-18.Это воскресенье называлось "днем двух полудней", поскольку в некоторых местах полдень отмечался дважды.Аллен был свидетелем перехода в Нью-Йорке, написав:

Я слышал колокола забастовки Святого Павла в старое время.Четыре минуты спустя, послушный электрическому сигналу из Морской обсерватории ... шарик времени быстро спустился, звон старой Троицы прозвенел двенадцатью измеренными ударами, и местное время было заброшено, вероятно, навсегда.

Большая часть США вскоре последовала их примеру.См .: Бартки И.Р.Принятие стандартного времени.Technol Cult 1989 Jan; 30 (1): 25-56.https://dx.doi.org/10.2307/3105430

# Rule    NAME    FROM    TO  TYPE    IN  ON  AT  SAVE    LETTER
Rule  CA  1948    only    -   Mar 14  2:01    1:00    D
Rule  CA  1949    only    -   Jan  1  2:00    0   S
Rule  CA  1950    1966    -   Apr lastSun 1:00    1:00    D
Rule  CA  1950    1961    -   Sep lastSun 2:00    0   S
Rule  CA  1962    1966    -   Oct lastSun 2:00    0   S
# Zone    NAME        GMTOFF  RULES   FORMAT  [UNTIL]
Zone America/Los_Angeles -7:52:58 -   LMT 1883 Nov 18 12:07:02
          -8:00   US  P%sT    1946
          -8:00   CA  P%sT    1967
          -8:00   US  P%sT

Вы видите до 18 ноября 1883 г. часовой пояс America/Los_Angeles не UTC-08:00, а UTC-07:52 (смещение часового пояса в формате UTC учитывает только часы / минуты, но не секунды)

Когда вы вводите timestamp '0912-02-29 02:02:10.089' в столбец TIMESTAMP WITH TIME ZONE или TIMESTAMP WITH LOCAL TIME ZONE, Oracle фактически выполняет

FROM_TZ(timestamp '0912-02-29 02:02:10.089', SESSIONTIMEZONE)

Вы ввели дату 0912-02-29, которая предшествует 1883 году, но я неЯ не знаю точно, почему вы получаете разницу в результате.Возможно, в определенный момент Oracle игнорирует, что America/Los_Angeles не был равен UTC-08:00 до 1883 года - это можно считать ошибкой.

В любом случае, Oracle рекомендует установить DBTIMEZONE = UTC, иначе ничего не делаетсмысл на мой взгляд.

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