2008-10-07 35 views
5

我有一個多時區的Web應用程序,在數據庫中存儲UTC中的所有日期時間值,當服務器發生操作時,我可以輕鬆地將時間轉換爲UTC。檢測和存儲Web應用程序客戶端的時區的最佳方式是什麼?

但是,當客戶端輸入時間或時間跨度時,檢測並存儲它的最佳方法是什麼?

我目前做如下:

  1. 獲取Date.getTimezoneOffset()(JavaScript的)
  2. 後的值來對頁面通過ICallbackEventHandler服務器端代碼。
  3. 將該值存儲在會話中
  4. 在任何後續請求中,使用客戶端的時區計算輸出/輸入日期時間值。

不管實際的實施情況如何,這看起來像是一個非常優雅的解決方案。有沒有人有更好的方法?

回答

4

我做的事情非常相似,但我現在認爲我更喜歡使用JavaScript將所有時間都轉換爲本地客戶端。服務器將在所生成的頁面中以UTC爲單位給出所有時間,並且在頁面加載後,JavaScript將對其進行轉換。

這消除了服務器端代碼的混淆,因爲我總是知道它是什麼時間(UTC)。在客戶端,我使用jquery和each()函數來一次格式化所有時間值。我將每個時間都寫成隱藏字段中的unix時間,以便使用jquery進行處理。

我用這種方法看到的唯一問題是,a)我沒有一個真正的日期/時間格式化例程,但在JavaScript中,b)如果用戶關閉了javascript,那麼它不起作用。

+0

這是一個不錯的解決方案,和一個我認爲是。我避開它的唯一原因是一個「倒數計時器」的情況,就像用戶剩餘X小時做一個動作一樣。 我覺得這樣的邏輯應該發生在服務器上,但我想這將是罰款的JavaScript。 – 2008-10-09 16:23:31

+0

任何對用戶的時間限制都必須在服務器上進行檢查。倒計時計時器似乎與這個問題有關: http://stackoverflow.com/questions/198049/prevent-js-alert-from-pausing-timers 這是一個類似的想法,客戶端驗證容易受騙。 – Mnebuerquo 2008-10-15 07:35:33

2

您可以使用HttpRequest對象的「header」屬性來查詢客戶端發送的「If-Modified-Since」報頭。這個頭應包含日期,包括客戶端的時區,這樣的格式:

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT 

一個簡單的字符串的提取會給你的時區代碼。 但是,恐怕不是所有的瀏覽器在發送這個頭文件時都是連貫的,所以你應該嘗試一下。

問候, 法布里奇奧

相關問題