UTC日期时间转换为当地时间

时间:2016-04-08 07:32:16

标签: c# mysql utc timezone-offset localtime

我将数据存储到MySql datetime字段中,我一直在保存C#的UTC日期(使用 的 someDate.ToUniversalTime())。

我在中欧时区。

我有一个日期已于2016年4月8日保存为2016-04-07 16:00:00(当时事件已设定)并且本次活动的正确当地时间是2016-04-07 17 :00:00,因此当时保存为GMT + 1。我使用 someDate.ToLocalTime()来获取正确的本地时间,并且效果很好。

今天(4月),由于3月底发生的DayLight事件,我们有GMT + 2偏移,现在 someDate.ToLocalTime()显示我多1小时:2016-04- 07 18:00:00这是不正确的。

如何普遍解决这个问题? 我想保存UTC时间(现在),然后应用一些使用用户当前时区的系统转换,并始终从我保存的UTC日期返回有关当前DayLightSaving状态的正确本地时间。 它也应该返回2016-04-07 17:00:00而不是2016-04-07 18:00:00

1 个答案:

答案 0 :(得分:3)

您的假设是错误的:2016-04-07 16:00 UTC在中欧时区的有效当地时间始终是2016-04-07 18:00,而且从未是2016-04-07 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