2011-04-17 100 views
3

我有四個整數:.NET:獲取UTC日期時間從最新與GMT偏移

  • 日(1 - 31)
  • 月年(1 - 12)
  • 一天中的小時(0 - 23)

這些整數表示用戶在我的網頁上選擇的日期和時間。他們可能在地球上的任何地方。

謝天謝地,我有他們在地球上位置的GMT偏移量。這是一個小數。

如何取這四個整數加上GMT偏移十進制數,然後得到一個代表UTC的DateTime代表它們?

要回答這個問題,填補了該功能的方法體:

公共靜態的DateTime UtcDateTime(INT日,INT月,年整型,詮釋小時,小數gmtOffset){// TODO }

+0

鑑於世界上一些時區是在1個小時的分數增加的,不知道在一小時內的分鐘,你不能準確拿出每小時UTC表示它們。 – Joe 2011-04-18 00:11:46

+1

你是否考慮夏令時? – David 2011-04-18 00:27:44

+0

@Joe:嗯?時間是分數。我有十進制的GMT。 x /(60 * 60)= GMT偏移分數/(100 * 60),其中'x'是秒。 – DotNetDateQuestion 2011-04-18 01:04:15

回答

3

我會建議結合使用DateTimeTimeZoneInfo。您可以在您的服務器上存儲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; 
} 
相關問題