2016-04-08 178 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