当DateTime.Kind为未指定时,.NET DateTime的 Ticks表示什么?
请查看下面的C#代码:
DateTime.TryParse("2025-05-03T02:10:36", out DateTime dateTime); Console.WriteLine(dateTime.Kind); Console.WriteLine(dateTime.Ticks);
Ticks 的值在这里是 638818350360000000,Kind 的值是 "Unspecified"。我明白为什么 Kind 未被指定,但我不明白在这种情况下系统如何为 Ticks 确定一个值。
文档指出
如果
DateTime对象的Kind属性被设为Unspecified,它的滴答数表示自公元0001年 1月 1日午夜12:00:00以来在未知时区经过的时间。
我完全不知道那是什么意思。在不知道该时间所在时区的情况下,如何指定自某一时间点以来的滴答数?
解决方案
在不知道该时间所在时区的情况下,如何指定自某一时间点以来的滴答数?
基本上,可以把它看作独立于任何具体时区。
需要理解的重点是,具有 Kind 为 Unspecified 的 DateTime 并不表示一个时间上的瞬间——它表示在Noda Time中我们称之为 LocalDateTime 的东西(至少大致如此;还要考虑日历系统的整体因素)。
即使你忽略 Ticks 属性本身,只要举个例子,例如没有时区的2026年 3月 1日早上8 点——这就是一个 DateTime,带有一种 Unspecified 的情形可以表示的时间点。那个日期/时间在世界各地的不同时区中确实会对应不同的瞬时,但在某些情况下,它仍然可以是一个有用的概念。
正如评论中已经提到的,如果你使用我的 Noda Time 库,就不会出现这类歧义。但如果你想坚持使用BCL类型(这是一个合理的选择)来表示一个时间点,你可以要么使用 DateTimeOffset,要么始终确保使用一个 DateTimeKind 的 Utc。