本地时间到UTC保持DST

问题描述:

我有一个数据网格是使用来自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)。

任何帮助?????

你必须牢记的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' –

也许你可以尝试让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()' –