C# DateTime 解析不一致

Posted

技术标签:

【中文标题】C# DateTime 解析不一致【英文标题】:C# DateTime Parse inconsistency 【发布时间】:2018-12-26 04:37:43 【问题描述】:

我有一个关于 DateTime 的问题 我的代码是:

DateTime.ParseExact("2018-06-13T12:05:55.7738391Z", "yyyy-MM-ddTHH:mm:ss.fffffffZ", System.Globalization.CultureInfo.InvariantCulture).ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ")

结果是:

"2018-06-13T14:05:55.7738391Z"

为什么 DateTime 会增加 2 小时? (我试过 ...00:05:55 ...) 以及如何防止这种情况发生?

【问题讨论】:

可能是时区问题。 ToString 之前尝试使用.ToUniversalTime() 其他选项是使用样式,例如。 DateTimeStyles.AdjustToUniversalParseExact()。要解决的一件事是格式,最后你应该有 K 表示种类,而不是 Z,除非你实际上假设日期时间将只有 UTC。 最好DateTimeStyles.RoundTripKind 会更好,因为Z 可以很好地映射到DateTimeKind.Utc 【参考方案1】:

我猜你的时区是 UTC+2。

var time = DateTime.ParseExact("2018-06-13T12:05:55.7738391Z", "yyyy-MM-ddTHH:mm:ss.fffffffZ", System.Globalization.CultureInfo.InvariantCulture);

Console.WriteLine(time.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); // + 2 hours ?   
Console.WriteLine(time.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); // +0 hours ?

你说的时间是UTC(Z=zulu时间=UTC+0),但是你电脑的时区是自动加2小时的。

--

为了完全正确,您应该使用time.ToString("o");。你很困惑,因为你的 ToString 包含一个尾随 Z,它不是由格式化程序添加,而是复制到输出中。

【讨论】:

以上是关于C# DateTime 解析不一致的主要内容,如果未能解决你的问题,请参考以下文章

c#访问性不一致的问题

为啥 C# 似乎不关心一致性? [关闭]

解析本地数据存储不一致

Python中时间格式的问题:models与form与mysql中的不一致。

SSIS 将 m/dd/yyyy 转换为 yyyymmdd 不一致

C# 中插入符号位置、字符串长度和匹配索引的不一致