c# - UTC 日期时间转换为本地时间

标签 c# mysql utc timezone-offset localtime

我将数据存储到 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 时间(如现在),然后应用一些使用用户当前时区的系统转换,并始终从我保存的关于当前 DayLightSaving 状态的 UTC 日期返回正确的本地时间。 它还应该返回 2016-04-07 17:00:00 而不是 2016-04-07 18:00:00

最佳答案

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

关于c# - UTC 日期时间转换为本地时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36493996/

相关文章:

c# - 匹配可选组的正则表达式

c# - pin_ptr 无法在非托管类中声明托管对象

c - 为什么在转换为 tm 结构并返回时两个 time_t 值之间存在一小时的差异?

python - 在python中将带有时区缩写的非UTC时间字符串转换为UTC时间,同时考虑夏令时

Java如何从udp数据包中的Sint64解析UTC

c# - 没有结果的 EF6 存储过程

MySQL 左连接计数未显示左表中的所有条目

mysql - 列出表中的元素,添加其他表中的引用并在 ORDER BY 中使用它们

mysql - 使用一个不同的列选择行

c# - 在泛型 (Y) 方法中使用泛型 (X) 委托(delegate),其中 Y 扩展了一些基类。无法转换为基类