2012-09-04 92 views
2

我想要做的事情很簡單:.NET日期時間及TimezoneInfo.ConvertTime黨

private static TimeZoneInfo Tzi = // ... custom timeZone I've set; 
    public static DateTime ToTimeZone(DateTime dateTime, TimeZoneInfo target) 
    { 
     return TimeZoneInfo.ConvertTime(dateTime, Tzi, target); 
    } 

理念是 - 說得出服務器的所有日期將自動轉換爲特定的時區和保存這樣對DB (UTC,美國中部,太平洋美國,無論如何)。

只要在服務器上設置的時區與Tzi相同,此功能就可以很好地工作。然而,如果不是這樣,轉換就會失敗 - 創建DateTime實例時,.NET會將其設置爲機器的TimeZone,然後TimeZoneInfo.ConvertTime(dateTime,Tzi,target)以一種奇怪的方式處理我的請求。例如,假設服務器時區是太平洋(UTC -8),我將Tzi設置爲中央(UTC -6),並且我以Singapure(UTC +8)爲目標。

現在,當我呼叫TimeZoneInfo.ConvertTime(dateTime,Tzi,目標)首先「將dateTime從UTC -8轉換爲UTC -6(Tzi時區),加上2小時......並且只有從Tzi到目標。

有沒有辦法發信號給TimeZoneInfo.ConvertTime我發送的dateTime是在TimeZone中我是通過參數傳入的,而不是在服務器的TimeZone中?

編輯: 好的,兩個答案都是很好的建議,但似乎我有不同的麻煩。 TimeZoneInfo.ConvertTime(DATETIME,奧茲,目標)似乎是正常工作,而真正的罪魁禍首居然是:

return Json(new {data}, JsonRequestBehavior.AllowGet); 

輸出日期,如: 「創建」: 「/日期(1346810072950)/」。我已經確認發送日期根據服務器上的TimeZone而不同(更改服務器的TimeZone後需要重新啓動AppPool)。任何人都有這方面的經驗,並建議如何影響ASP.NET MVC輸出日期在JSON中的方式發回給客戶端?

+2

相關:http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded

+0

1346802872950 ... – kape123

回答

2

可以使用DateTimeOffset代替DateTime - 這種結構包括一個時區偏移性,創造它的實例,所以當你要指定哪一個偏移使用。

3

ConvertTime應該做的工作。也許你的問題是DateTime.Kind

請看下面的例子:

// Gets current local date 
// Returns 04/09/12 11:30 in my case 
var date = DateTime.Now; 

// Sets DateTime as Unspecified kind (not local nor UTC) 
// Returns same date as before, but the date is not tagged as "local" 
date = DateTime.SpecifyKind(date, DateTimeKind.Unspecified); 

// Converts the current date, specified as UTC+12, into a date specified as UTC-11 
// Returns 03/09/12 12:30 in my case, which is the expected result 
// (23 hours between previous date and result) 
var zz = TimeZoneInfo.ConvertTime(
    date, 
    TimeZoneInfo.FindSystemTimeZoneById("UTC+12"), 
    TimeZoneInfo.FindSystemTimeZoneById("UTC-11")); 
+0

我總是享受downvotes沒有任何評論解釋... – ken2k