2016-04-08 210 views
0

我將數據存儲到MySql日期時間字段中,並且我始終在那裏保存C#的UTC日期(使用 someDate.ToUniversalTime())。UTC datetime轉換爲當地時間

我在中歐時區。

我有一個保存在2016年3月8日爲2016年4月7日16:00:00(事件在將來當時設定)和當地時間此事件的一個日期是2016年4月7日17:00:00,所以當時保存爲GMT + 1。我用someDate.ToLocalTime()獲得正確的本地時間,它運作良好。

今天(四月),因爲白天的事件,在三月底發生,我們有GMT + 2偏移現在someDate.ToLocalTime()展示箱多小時:2016年4月7日18:00 :00這是不正確的。

如何解決這個普遍? 我想保存UTC時間(與現在一樣),然後應用某些使用用戶當前時區的系統轉換,並始終從我保存的UTC日期(當前DayLightSaving狀態)中返回正確的本地時間。 它也應該返回2016-04-07 17:00:00而不是2016-04-07 18:00:00

+0

使用'TIMESTAMP'而不是'DATETIME'然後設置'time_zone'會話變量,MySQL的將處理其餘的事情。 – eggyal

+0

這是一個桌面應用程序,還是一個網絡應用程序?通常,只有桌面應用程序應該使用「ToLocalTime」和「ToUniversalTime」。 –

回答

1

你的假設是錯誤的:有效的本地時間2016-04-07 16:00 UTC中歐時區永遠是2016年4月7日18:00,永遠不會是2016年4月7日17:00。您必須始終根據您正在查看的日期而不是當前日期來計算UTC偏移量。

請嘗試下面的代碼。它將總是打印相同的價值觀,無論你的當前日期(即不管你是目前在夏季時間或沒有)

var dt1 = new DateTime(2016, 3, 1, 15, 0, 0, DateTimeKind.Utc); 
var dt2 = new DateTime(2016, 5, 1, 15, 0, 0, DateTimeKind.Utc); 

var s1 = dt1.ToLocalTime().ToString("s"); 
var s2 = dt2.ToLocalTime().ToString("s"); 

Console.WriteLine(s1); //prints 2016-03-01T16:00:00 because GMT+1 at that date 
Console.WriteLine(s2); //prints 2016-05-01T17:00:00 because GMT+2 at that date