为啥 C# 提前 7 小时解析 DateTime?

Posted

技术标签:

【中文标题】为啥 C# 提前 7 小时解析 DateTime?【英文标题】:Why is the C# parsed DateTime 7 hours ahead?为什么 C# 提前 7 小时解析 DateTime? 【发布时间】:2016-11-21 15:11:18 【问题描述】:

在尝试将本地时间从 javascript 转换为 C# 时,我在 S/O 周围寻找了一些示例。虽然我找到了一些不同的方法来解决这个问题,但它们都将最后时间渲染为比我提前 7 小时,我不明白。

例如:

var t = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1468877118719).ToLocalTime();
Console.WriteLine(t)
7/18/2016 9:25:18 PM//<--output

var t = DateTime.Parse("2016-07-18T21:27:32.513Z");
Console.WriteLine(t);
7/18/2016 9:27:32 PM//output

而且,即使我只是尝试

var now = DateTime.Now;
Console.WriteLine(now);
7/18/2016 9:39:55 PM//the output is 7 hours ahead. 

谁能告诉我为什么会发生这种情况以及如何纠正它?

【问题讨论】:

任何时候你得到一个意外的日期/时间差异,这是一些确切的小时数,它几乎总是一个时区问题。毫无疑问,您的计算机是 UTC+7 的时区 您将本地时间视为 UTC 时间。不要这样做(或获取 UTC 时间,而不是本地时间,作为您的输入)。 DateTimeKind.Utc 是你的问题。获取当地时间。 @MarcB 你知道我是否可以简单地更改设置来纠正问题? 如果最后一个关闭了 7 小时,您就有问题了。检查您的时区和区域设置。如果它在服务器上运行,请检查。我只是在本地运行了相同的代码并获得了正确的本地时间。 【参考方案1】:

您运行它的机器将其本地时钟设置为与 UTC 匹配。

这在服务器和 *nix 工作站上很常见,包括 OS X。

【讨论】:

【参考方案2】:

您看到的是 UTC 值的输出。

改变

Console.WriteLine(t);

Console.WriteLine(t.ToLocalTime());

当然,这只会在第二种情况下有所不同。您已经在第一个实例中调用了ToLocalTime()

【讨论】:

@spb: 那可能是因为代码上下文的当前时区 UTC 看这里:link

以上是关于为啥 C# 提前 7 小时解析 DateTime?的主要内容,如果未能解决你的问题,请参考以下文章

C#与mongodb DateTime转换时区相差8小时

C#如何将DateTime的12小时格式转换为24小时时间格式????

C#如何将DateTime的12小时格式转换为24小时时间格式????

如何使用 c# 在 azure 表存储中查找 2 dateTime 之间的小时数

c#中的JSON DateTime序列化处理一位数和两位数小时

为啥强制转换 SQL MAX(DateTime) 命令在 SSMS 中有效,但在 C# 中无效? [复制]