我會建議結合使用DateTime
與TimeZoneInfo。您可以在您的服務器上存儲UTC時間,並使用他自己的TimeZoneInfo
將時間轉換爲每個用戶。 TimeZoneInfo
可以由用戶設置,或者您可以以某種方式從Windows
設置中提取它(如果可能的話)。我們要求用戶在其設置頁面上設置TimeZoneInfo
(通過下拉列表)。
更新
雖然在MSDN微軟指出,我們應該使用DateTimeOffset
而不是DateTime
有使用DateTimeOffset
一些問題。我試圖序列化/反序列化通過WCF傳輸它們的DataTimeOffset實例失敗。和DateTime/TimeZoneInfo工作正常。我很喜歡DateTimeOffset,但它在某些方面仍然不適合真實應用。
另一個DateTimeOffset的缺點是它不包含所有需要轉換時間的信息,因爲它只包含一個偏移量。但是可能有幾個具有相同偏移量的實際時區,因此只有給定偏移量才能恢復時區。時區不僅僅是一個偏移量,它是定義時間轉換的一組規則,冬季/夏季時間e.t.c.
更新
給你:
private static DateTime ToUTC(int day, int month, int year, int hour, decimal utcOffset)
{
TimeSpan offset = TimeSpan.FromMinutes((double)(utcOffset * 60)); // time zone offset is always aligned to minutes
return new DateTimeOffset(year, month, day, hour, 0, 0, offset).ToUniversalTime().DateTime;
}
鑑於世界上一些時區是在1個小時的分數增加的,不知道在一小時內的分鐘,你不能準確拿出每小時UTC表示它們。 – Joe 2011-04-18 00:11:46
你是否考慮夏令時? – David 2011-04-18 00:27:44
@Joe:嗯?時間是分數。我有十進制的GMT。 x /(60 * 60)= GMT偏移分數/(100 * 60),其中'x'是秒。 – DotNetDateQuestion 2011-04-18 01:04:15