2016-11-25 88 views
0

我有一個數據網格是使用來自UTC值轉換爲本地時間的DateTime列進行排序的。問題在於DST,因爲在一年中有1個小時將會重複(從11月6日2:00:00 AM返回到1:00:00 AM)。我已經實現了一種方法來使用從IComparable繼承的類來比較列,並手動比較使用ToUniversalTime()再次轉換它們的日期,但它會返回錯誤的值。以更好地解釋讓我給個例子:本地時間到UTC保持DST

 DataTable table = new DataTable(); 
     table.Columns.Add("UTC Date", typeof(DateTime)); 
     table.Columns.Add("Local Date", typeof(DateTime));    
     table.Columns.Add("UTC From Local", typeof(DateTime)); 
     dataGridView1.DataSource = table; 
     DateTime aux; 

     DataRow newRow = table.NewRow(); 
     aux = new DateTime(2016, 11, 06, 06, 30, 0, DateTimeKind.Utc); 
     newRow["UTC Date"] = aux; 
     newRow["Local Date"] = aux.ToLocalTime(); 
     newRow["UTC From Local"] = Convert.ToDateTime(newRow["Local Date"]).ToUniversalTime(); table.Rows.Add(newRow); 

顯示的值將是:

UTC日期:2016年11月6日6:30 AM

本地日期:2016年11月6日上午1:30

UTC從地方:2016年11月6日上午7:30

正如你可以看到列「UTC從本地」是錯誤的,或者至少我希望6:30(DST考慮)而不是7:30(不含DST)。

任何幫助?????

回答

0

你必須牢記的DataColumn的DateTimeMode財產。如果您創建新的DataColumn它將設置爲未指定。但是,在您的使用情況下,你想UTC本地

var table = new DataTable(); 
table.Columns.Add("UTC Date", typeof(DateTime)).DateTimeMode = DataSetDateTime.Utc; 
table.Columns.Add("Local Date", typeof(DateTime)).DateTimeMode = DataSetDateTime.Local; 
table.Columns.Add("UTC From Local", typeof(DateTime)).DateTimeMode = DataSetDateTime.Utc; 

var newRow = table.NewRow(); 
var aux = new DateTime(2016, 11, 06, 06, 30, 0, DateTimeKind.Utc); 
newRow["UTC Date"] = aux; 
newRow["Local Date"] = aux.ToLocalTime(); 
newRow["UTC From Local"] = Convert.ToDateTime(newRow["Local Date"]).ToUniversalTime(); 
+0

非常感謝!它的工作,讓我嘗試實現這個解決方案的真正的應用程序,因爲我發佈的只是一個例子。所以通過閱讀你的解決方案,我可以假設使用'ToLocalTime()'不會丟失DST信息,問題是在創建DataTable時我沒有指定'DateTimeMode' –

-1

也許你可以嘗試讓GTM偏移並將其添加到您的「UTC從本地」:

aux = new DateTime(2016, 11, 06, 06, 30, 0, DateTimeKind.Utc); 
newRow["UTC Date"] = aux; 
newRow["Local Date"] = aux.ToLocalTime(); 
TimeSpan UtcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(aux); 
newRow["UTC From Local"] = Convert.ToDateTime(newRow["Local Date"].Add(UtcOffset)).ToUniversalTime(); 
+0

我不明白。你在UTC調用'GetUtcOffset'?你能指望什麼? –

+0

我猜在UTC調用'GetUtcOffset'會得到0,無論如何也從DST的日期得到相同的偏移距日期DST。我相信唯一的區別是調用'IsDaylightSavingTime()' –