Как рассматривать все даты как UT C, если dbTimezone Oracle отличается? - PullRequest
1 голос
/ 04 февраля 2020

У меня есть база данных Oracle, которая дает +00:00 результат для запроса:

выберите dbTimezone из двойного;

Я хотел бы работать с любой датой / time в моем Java приложении всегда как UT C.

В таблице, с которой я работаю, есть столбец типа Date, который получает значение по умолчанию из sysdate.

Even хотя я запускаю свое приложение с -Duser.timezone=UTC, когда я вставляю в эту таблицу и читаю этот столбец Date с rs.getTimestamp("DATE_CREATED"), это на час больше ожидаемого текущего UTC время:

Expected current UTC: 2020-02-04 20:38:12.0
Actual: 2020-02-04 21:38:12.0

Я также заметил, что select current_date from dual вместо sysdate приведет к ожидаемому текущему времени UT C. Следует ли изменить значение по умолчанию для этого столбца с sysdate на current_date (alter table MY_TABLE modify DATE_CREATED default current_date) или существуют другие способы настройки часового пояса в приложении Java без изменения настроек базы данных?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Вы можете использовать:

CREATE TABLE mytable (
  id NUMBER PRIMARY KEY,
  date_created DATE
);

ALTER TABLE mytable MODIFY date_created DEFAULT SYSTIMESTAMP AT TIME ZONE 'UTC';

(системная временная метка будет преобразована в часовой пояс UTC и затем неявно приведена к типу данных DATE для значения по умолчанию.)

Тогда:

INSERT INTO mytable( id ) VALUES ( 1 );

SELECT * FROM mytable;

выходы:

ID | DATE_CREATED       
-: | :------------------
 1 | 2020-02-04 21:57:47

дБ <> скрипка здесь

1 голос
/ 05 февраля 2020

Вы можете получить время в миллисекундах из даты и преобразовать в нужный формат:

OffsetDateTime now = OffsetDateTime.now(ZoneOffset.of("+02:00"));
System.out.println("+02:00: " + now); //+02:00: 2020-02-04T22:59:11.617457100+02:00
System.out.println("+02:00 in millis: " + now.toInstant().toEpochMilli()); //+02:00 in millis: 1580849951617

OffsetDateTime utc = Instant.ofEpochMilli(now.toInstant().toEpochMilli()).atOffset(ZoneOffset.UTC); 
System.out.println("UTC: " + utc); //UTC: 2020-02-04T20:59:11.617Z
System.out.println("UTC in millis: " + utc.toInstant().toEpochMilli()); //UTC in millis: 1580849951617

Предполагается, что время в миллисекундах всегда будет одинаковым.

...