2013-12-12 35 views
0

我目前正在嘗試決定如何處理我的web應用程序,該應用程序使用Oracle存儲數據,PHP作爲服務器端語言和JavaScript作爲客戶端。在不同時區使用的應用程序中存儲Oracle日期

該應用程序將在英國託管,但來自英國,美國和其他歐洲國家的用戶將登錄並使用它。此時,如果由於用戶操作而發生任何「可審覈」事件,則會將記錄保存到審計跟蹤中,並將SYSDATE保存在審計跟蹤中。

當用戶查看審計跟蹤時,我希望時間顯示在他們的本地時區。

我在想的是: - 由於SYSDATE是Oracle服務器上系統時鐘的時間,我應該將Oracle服務器的時區設置爲UTC(夏令時沒有更改)。這將確保所有日期都保存在一個恆定時區,因此轉換它不應該很困難。 - 使用JavaScript的getTimezoneOffset()函數將時間轉換爲瀏覽器中的本地時間以添加/減去分鐘。

這是正確的做法,還是我錯過了什麼?

回答

0

在您的表和PL/SQL代碼中始終使用數據類型TIMESTAMP WITH LOCAL TIMEZONE。然後,日期和時間總是正確插入並顯示在當前用戶會話的時區中。

數據類型「TIMESTAMP WITH TIMEZONE」還包含時區信息,但要正確顯示,您必須將其轉換爲用戶會話時區。當你在美國時,雖然它代表正確的時間,但你可能不喜歡看到「2012-12-12 15:45:00 -01:00」。

SYSDATE的數據類型爲「DATE」,它不包含任何時區信息,請使用CURRENT_TIMESTAMPLOCALTIMESTAMP會話時間戳或SYSTIMESTAMP對於您的Oracle服務器所在的時區。

+1

嗨,謝謝你的回答。不幸的是,我不認爲將所有的SYSDATEs改爲TIMESTAMP WITH LOCAL TIMEZONE對我來說都是可能的 - 這意味着會改變幾千個SQL語句。你認爲我的方法可行嗎?如果所有SYSDATE都以UTC格式存儲,那麼爲什麼用戶在存儲它時的時區是什麼?當它顯示回給用戶的時區時,它可以從UTC轉換爲用戶的時區。 – user1578653

+0

是的,你的問題也應該起作用 –

1

你的方法聽起來不錯的權利,直到這一點:

使用JavaScript的使用getTimezoneOffset()函數來加/減分轉換的時間爲本地時間在瀏覽器中。

你不想這樣做,因爲它會產生不同的時間。如果將UTC值傳遞給瀏覽器,請將其作爲ISO8601格式傳遞,並在構造函數中使用它,例如new Date('2013-01-01T01:23:45.678Z')

如果您需要支持較舊的瀏覽器,或者您想更好地控制格式,請考慮使用moment.js

此外,您應該知道,如果您正在使用的值處於具有不同DST的時間段內,則當前版本的JavaScript可能會使UTC到本地時間轉換的值接近夏令時轉換值規則,而不是當前有效的規則。你可以閱讀更多關於這個on my blog here。你會有時間或日期的這個問題。

如果這對您至關重要,那麼您需要避免在JavaScript中進行轉換,而是在您的PHP代碼中進行轉換。 (當然,這意味着你需要詢問用戶的時區,比如America/Los_Angeles,所以你可以使用PHP時區功能。)

相關問題