C#DateTime.Parse(String)在不同的系统中返回不同的值

C#DateTime.Parse(String)在不同的系统中返回不同的值,c#,datetime,C#,Datetime,今天,我在不同的服务器上运行时,在DateTime.Parse(String)方法中观察到一些奇怪的行为。这可以在不同的在线C#编译器中观察到 我的输入为yyyy-MM-ddTHH:MM:ssZ格式。示例:让我们使用2020-02-12T16:57:36Z,转换为刻度的是:63717123456000000(使用转换) 这是我用于测试此行为的代码: DateTime parsedDateTime = DateTime.Parse("2020-02-12T16:57:36Z"); Console.

今天,我在不同的服务器上运行时,在
DateTime.Parse(String)
方法中观察到一些奇怪的行为。这可以在不同的在线C#编译器中观察到

我的输入为
yyyy-MM-ddTHH:MM:ssZ
格式。示例:让我们使用
2020-02-12T16:57:36Z
,转换为刻度的是:
63717123456000000
(使用转换)

这是我用于测试此行为的代码:

DateTime parsedDateTime = DateTime.Parse("2020-02-12T16:57:36Z");
Console.WriteLine(parsedDateTime + " " + parsedDateTime.Kind.ToString() + " " + parsedDateTime.Ticks);
在上,它返回
02/12/2020 16:57:36本地63717123456000000

在上,它返回
12.02.2020 17:57:36本地637171270560000000


我知道DateTime被解析为本地时区并以本地时间显示,但为什么不同系统之间的刻度数也不同呢

这是关于您运行的服务器的CultureInfo。具有不同的重载和解析日期时间以及货币,这取决于系统的CultureInfo(语言和地区等)。

解析日期的不同时区的可能解决方案如下:

DateTime parsedDateTime = DateTime.Parse(
    "2020-02-12T16:57:36Z", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.AdjustToUniversal);

yyyy-MM-ddTHH:MM:ssZ格式的字符串表示。
它被正确地解析,但不幸的是,结果是
DateTime
值,并且它的值会根据计算机的时区进行相应的调整

如本报告开头的评论所述

从V2.0开始,DateTime还存储了一些关于其时间的上下文
3状态值形式的区域,表示未指定的Utc或
地方的这存储在64位数值的两个顶部位中
剩余的位存储滴答声计数。此信息
仅在时区转换期间使用,不属于
日期时间的标识。因此,像Compare和Equals这样的操作
忽略此状态。这是为了与早期的行为保持一致
和性能特征,避免强迫人们进行交易
由于夏令时的影响。请注意,这几乎没有影响
关于DateTime如何工作,除非在特定时间
区域是必需的,例如在转换和一些解析和格式化过程中
案例。
因此,
DatetimeKind.Local
日期的
Ticks
属性是相对于本地的
0001年1月1日午夜12:00:00
,而不是相对于UTC的
0001年1月1日午夜12:00:00

这在中有记录

这也意味着,在不同时区的不同服务器上,通过这种
DateTime.Parse
获得的两个日期实例将被比较为“不等”,即使它们来自描述相同UTC日期的相同字符串。这是为了向后兼容


为了直接比较刻度,您需要先将两个日期设置为
Kind.UTC

答案已经在问题中了。关键在于产出:12.02.2020 17:57:36Local6371270560000000

dateTime.kind显示的是什么类型的日期?由于这两个网站很可能位于两个不同的地方,因此它显示了两个不同的时间,因为.net已将给定的UTC时间转换为其本地时间,这通过DateTime.Kind反映出来

如果你改为运行这个

DateTime parsedDateTime = DateTime.Parse("2020-02-12T16:57:36Z").ToUniversalTime();
Console.WriteLine(parsedDateTime + " " + parsedDateTime.Kind.ToString() + " " + parsedDateTime.Ticks);

您将获得相同的日期/时间组合,因为现在它不再转换为本地日期时间,而是UTC

在本地计算机上运行您的代码时,我的输出是:

20年2月12日10:57:36当地时间下午637171450560000000


这基本上意味着在给定的UTC时间,我的国家是20年2月12日晚上10:57:36。

事实上,这不是真的。字符串应解析为UTC时间,即使随后调整为本地时间)。这些刻度表示相隔一小时的时间,这表明这是一个时区问题(不是夏令时,除非您恰好在南半球…“刻度属性..与本地[时间]相关。”-这是关键!;)添加
Console.WriteLine(TimeZoneInfo.Local)对代码的修改使差异显而易见。。。