2008-09-23 49 views
8

我的數據庫位於加利福尼亞。 我的用戶表擁有所有用戶的時區,例如-0700 UTC日期時間調整

無論何時我向居住在用戶身上的用戶顯示日期,我如何從我的數據庫服務器調整時間。紐約? UTC/GMT -4小時

回答

4

您應該以UTC格式存儲數據並以本地時區格式顯示。

DateTime.ToUniversalTime() -> server; 
DateTime.ToLocalTime() -> client 

您可以使用AddXXX方法組調整日期/時間,但它可能容易出錯。 .NET支持System.TimeZoneInfo類中的時區。

0

直到.NET 3.5(VS 2008),.NET除了轉換UTC和UTC之外,還沒有任何對時區的內置支持。

如果時間差始終是所有一年之久(夏季和冬季)正好3個小時,只需使用yourDate.AddHours(3)改變的一種方式,並yourDate.AddHours(-3)將它改回來。一定要把這個分解成一個函數,解釋這3個小時增加/減少的原因。

0

你可以使用TimeZoneInfo.GetSystemTimeZones的組合(),然後使用TimeZoneInfo.BaseUtcOffset財產折價時間的基礎上的偏移差數據庫

信息上System.TimeZoneInfo here

0

你知道,這是一個很好的問題。今年我已經完成了我的第一個數據庫應用程序,並且由於與時間相關的輸入數據是Int64值,這就是我在數據庫中存儲的數據。我的客戶端應用程序檢索它並對該值執行DateTime.FromUTC()或FromFileTimeUTC(),並執行.LocalTime()以在當地時間顯示事物。我想知道這是否好/壞/可怕,但迄今爲止我的需求已經足夠好了。當然,這項工作最終將由我編寫的數據訪問層庫完成,而不是在數據庫本身。

似乎工作得不錯,但我相信其他有這方面經驗的人可能會指出這不是最好的方法。

祝你好運!

2

如果使用.Net,則可以使用TimeZoneInfo。既然你用'c#'標記了這個問題,我會假設你這樣做。

第一步是獲取想要轉換爲的時區的TimeZoneInfo。在你的例子中,紐約的時區。這裏有一種方法可以做到這一點:

//This will get EST time zone 
TimeZoneInfo clientTimeZone 
    = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

//This will get the local time zone, might be useful 
// if your application is a fat client 
TimeZoneInfo clientTimeZone = TimeZoneInfo.Local; 

然後,您從您的數據庫讀取DateTime後,您需要確保其Kind設置正確。假設該DateTime的在DB是UTC(順便說一句,這是通常建議),你可以準備它轉換這樣的:

DateTime aDateTime = dataBaseSource.ReadADateTime(); 
DateTime utcDateTime = DateTime.SpecifyKind(aDateTime, DateTimeKind.Utc); 

最後,爲了轉換爲不同的時區,簡單地做到這一點:

DateTime clientTime = TimeZoneInfo.ConvertTime(utcDateTime, clientTimeZone); 

一些額外的言論:

  • TimeZoneInfo可以存儲在靜態字段,如果你只在少數特定時間段感興趣;
  • TimeZoneInfo存儲有關夏令時的信息。所以,你不必擔心這一點。
  • 如果你的應用程序是網頁,找出你的客戶端在哪個時區可能很難。一種方法是在這裏解釋:http://kohari.org/2009/06/15/automagic-time-localization/

我希望這有助於。 :)

+0

這應該被接受爲答案 – 2012-05-05 18:11:30