2008-11-19 63 views
1

我可能做錯了什麼 - 但不知道爲什麼。 我有一個DateTime字段在我的DB保持UTC時間爲什麼LocalTime顯示服務器時間而不是瀏覽器時間?

我的服務器在美國,瀏覽器在歐洲。

的pageLoad的代碼是如下:

DateTime t = DateTime.SpecifyKind((DateTime)rdr["startTime"], DateTimeKind.Utc); 
label1.Text = t.ToLocalTime().ToString(); 

所顯示的時間我得到的是美國本地時間,而不是歐洲。我應該怎麼做才能顯示瀏覽器的本地時間?

謝謝!

回答

4

的一種技術是使用客戶端瀏覽器上JavaScript來檢測客戶端時區偏移量(分鐘):

alert((new Date()).getTimezoneOffset(); 

這可以然後被髮送回服務器並存儲在會話或一個cookie和使用以抵消顯示給他們的UTC日期。或者,另一種技術是讓用戶配置文件指定他們的時區。

3

toLocalTime在您的服務器上執行,而不是在瀏覽器上執行。 如果你想轉換服務器端的日期,你必須得到用戶所在的時區(歐洲至少有3個時區,如果你計算夏令時,則有6個時間....)

一方法是將UTC時間發送到客戶端,然後使用一些javascript將其轉換爲用戶本地時間(JavaScript中的Date對象知道用戶系統設置的是什麼)

1

由於some wrote,代碼正在在服務器上執行 - 因此,應用的時區是服務器本地的時區是合理的。

除了他向瀏覽器發送UTC的建議(當它可用時它很好,但並不總是一個選項),如果您使用的是.NET 3.5,則應該查看TimeZoneInfo。這將使您可以在UTC和任意時區之間進行轉換,包括歷史更改。 (時區的時區比「GMT + 5」等多很多)。最大的困難在於計算用戶實際所處的時區。通常您可以通過JavaScript獲得當前UTC的偏移量,但這並不能讓您所有你需要的信息才能保持一致。遲早你可能必須有一個每個用戶的設置,他們在哪個時區。

1

我不認爲這是明智的存儲時間值在您的數據庫基於它是什麼時候在客戶端瀏覽器。

如果您在許多不同時區有很多客戶端,並且存儲的信息經過整理或共享 - 事件順序將不正確。例如,格林威治標準時間10:16在美國東部時間10:30之前。

由於這個原因,最好使用服務器時間(或者如別人所說的那樣更好 - 嘗試和使用UTC)。

+0

我的建議是始終使用UTC,特別是當您的當地時間有夏令時/夏令時時。有了UTC,每個時間點都有獨特的價值,並且很容易計算兩個日期之間的時間。而當你想要一個loacal時間時,只需使用正確的查詢或在客戶端進行轉換即可。 – some 2008-11-22 07:05:52

相關問題