2013-12-12 2 views
0

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

Приложение будет размещено в Великобритании, но люди из Великобритании, США и других европейских стран будут входить в систему и использовать его. В настоящий момент, если какое-либо событие «аудитируемого» происходит в результате действия пользователя, запись сохраняется в контрольном журнале, при этом SYSDATE сохраняется против него.

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

О чем я думаю: - Поскольку SYSDATE - это время системных часов на сервере Oracle, я должен установить часовой пояс сервера Oracle в UTC (без изменений для летнего времени). Это обеспечит сохранение всех дат в одном постоянном часовом поясе, поэтому преобразование его не должно быть затруднительным. - Преобразование времени в локальное время в браузере с использованием функции getTimezoneOffset() JavaScript для добавления/вычитания минут.

Это правильный способ сделать это, или я чего-то не хватает?

ответ

0

В ваших таблицах и PL/SQL-код всегда используется тип данных TIMESTAMP WITH LOCAL TIMEZONE. Затем даты и время всегда правильно вставляются и отображаются в часовом поясе текущего сеанса пользователя.

Datatype «TIMESTAMP WITH TIMEZONE» также содержит информацию о часовом поясе, но для правильного отображения вам необходимо преобразовать в часовой пояс пользовательского сеанса. Когда вы находитесь в штате США, вероятно, вам не нравится видеть «2012-12-12 15:45:00 -01: 00», хотя он представляет правильное время.

SYSDATE является тип данных «ДАТА» не содержит никакой информации временной зоны, используйте CURRENT_TIMESTAMP или LOCALTIMESTAMP для сеанса временной метки или SYSTIMESTAMP для часового пояса, где сервер Oracle проживаете.

+1

Привет, и спасибо за ваш ответ.К сожалению, я не думаю, что изменение всех SYSDATE в TIMESTAMP с локальным TIMEZONE будет возможно для меня - это будет означать изменение буквально тысяч SQL-операторов. Как вы думаете, мой подход будет работать? Если все SYSDATE хранятся в формате UTC, то почему имеет значение, в какой временной зоне находился пользователь, когда они его сохраняли? Он может быть преобразован из UTC в часовой пояс пользователя, когда он будет возвращен к ним. – user1578653

+0

Да, ваш aproach должен работать так же хорошо –

1

Ваш подход не звучал хорошо вплоть до этого момента:

Преобразование раз по местному времени в браузере с помощью функции в JavaScript getTimezoneOffset(), чтобы добавить/вычесть минут.

Вы не хотите этого делать, поскольку это даст другой момент времени. Если вы передаете значение UTC браузеру, передайте его как формат ISO8601 и просто используйте его в конструкторе, например new Date('2013-01-01T01:23:45.678Z').

Если вам нужно поддерживать более старые браузеры или вы хотите лучше контролировать форматирование, тогда рассмотрите вместо этого использование moment.js.

Кроме того, вы должны знать, что текущие версии JavaScript могут прерывать преобразование времени в формате UTC-local для значений, близких к переходам на летнее время, если значение, с которым вы работаете, находится в периоде, который отличался от DST чем тот, который в настоящее время действует. Вы можете узнать больше об этом on my blog here. У вас будет эта проблема с моментом или датой.

Если это важно для вас, тогда вам нужно будет избегать конверсий в JavaScript и делать это вместо кода PHP. (Конечно, это означает, что вам нужно будет спросить пользователя о своем часовом поясе, например America/Los_Angeles, так что у вас есть доступ к функциям часового пояса PHP.)

Смежные вопросы