提问者:小点点

C#DateTime不包含时区,但它知道初始化的方式。这怎么可能?


我正在阅读https://stackoverflow.com/a/6519330/1375882,我明白DateTime不包含时区。实际上,DateTime没有TimeZone成员字段。但是有ToLocalTime()和ToUniversalTime()成员。例如,我在2时区计算机中测试我的代码,它给出了跟踪(例如,现在它是16.12.2021 16:17:23在2时区),代码给出了:

DateTime tmpNow = DateTime.UtcNow;

//16.12.2021 14:17:23 - this if fine, DateTime is UTC
tmp = tmpNow.ToString();

//16.12.2021 16:17:23
tmp = tmpNow.ToLocalTime().ToString(); 

//16.12.2021 14:17:23 - this is fine, DateTime is UTC
tmp = tmpNow.ToUniversalTime().ToString(); 

DateTime tmpCustom = new DateTime(2021, 12, 16, 16, 9, 10);

//16.12.2021 16:09:10 - this is strange, I assume that DateTime(...) is aware that it is
// executed in +2 and that 16:09:10 is in +2 and therefore ToString should be 14:09:10
tmp = tmpCustom.ToString(); 

 //16.12.2021 18:09:10 - this is strange, see previous
tmp = tmpCustom.ToLocalTime().ToString();

//16.12.2021 14:09:10 - complete loss of understanding. If initialization has been to 14:09:10 UTC 
// as I expected, then ToLocalTime.ToString had to bee 16:09:10, but ToLocalTime()... was 18:09:10
// hence ToUniversalTime() definitely had to be 2 hours before - 16:09:10.
tmp = tmpCustom.ToUniversalTime().ToString();

所以,这真的很奇怪-DateTime以某种方式感知它是用UTC还是用日期时间数字的简单组合初始化的。如何解释DateTime代码的行为以及隐藏时区上的这种情况?


共1个答案

匿名用户

所有这些都在文档中,你只需要知道去哪里找。这里相关的是Kind属性。它是一个枚举:本地、Utc或未指定。

本地时,它假定当前区域性的时区。请参阅您使用的构造函数的文档:

Kind属性初始化为DateTimeKind。未指明。

然后转到ToUniversalTime()

ToUniversalTime方法返回的值由当前DateTime对象的Kind属性确定

[...]

未指定:当前DateTime对象假定为本地时间,转换的执行方式就好像种类是本地的一样。

因此,如果您将代码更改为新的日期时间(2021、12、16、16、9、10、DateTimeKind.Local),则此后的方法将按预期工作-除了您的注释声称您希望在那里看到“14:09”之外。那不会发生。