【问题标题】:UTC datetime conversion to local timeUTC 日期时间转换为本地时间
【发布时间】:2016-07-29 09:16:27
【问题描述】:

我将数据存储到 MySql 日期时间字段中,我总是从 C# 保存 UTC 日期(使用 someDate.ToUniversalTime())。

我在中欧时区。

我有一个日期保存在 08.03.2016 为 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

【问题讨论】:

  • 使用TIMESTAMP而不是DATETIME,然后设置time_zone会话变量——MySQL会处理剩下的。
  • 这是桌面应用还是网络应用?一般来说,只有桌面应用程序应该使用ToLocalTimeToUniversalTime

标签: c# mysql utc timezone-offset localtime


【解决方案1】:

您的假设是错误的:中欧时区 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

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多