在DateTime中,仅使用64位中的62位。负值不在规范中。我如何表示BC的日期?

问题描述 投票:3回答:1

使用VB.NET:

Debug.Print(DateTime.MinValue.ToString)
Debug.Print(DateTime.MaxValue.ToString)
Debug.Print(DateTime.MinValue.Ticks.ToString)
Debug.Print(DateTime.MaxValue.Ticks.ToString)

我获得:

01-01-0001
31-12-9999
0
3155378975999999999

二进制的最大值读取0010 1011 1100 1010 0010 1000 0111 0101 1111 0100 0011 0111 0011 1111 1111 1111‬

仅使用64位中的62位。

(1)为什么MSB用于提供日期容易达到公元前10000年的日期?

(2)这些2位是否保留用于我不知道的事情?

(3)要分配日期BC并使用它们进行算术运算,除了定义新的数据类型之外别无选择吗?

.net datetime
1个回答
4
投票

前两位用于“种类”:

  • 本地
  • 世界标准时间
  • 不明
  • “具有模糊案例的特殊知识的本地人”

my blog post for more information on this。不可否认,“种类”仅在.NET 1.1(IIRC)中引入;我怀疑在此之前的范围限制只是一个实用主义的问题。当您决定处理早于0001-01-01的值时会出现各种实际问题,我怀疑.NET设计者认为这些问题会比需要更大日期范围的开发人员数量更多地影响开发人员。

在如何处理早期日期方面,我强烈建议不要编写自己的日期/时间代码,除非你绝对必须这样做。我个人推荐我的Noda Time库。那个handles的日期在[9999BC,9999AD],并且有时间的纳秒精度,并支持IANA time zone database

© www.soinside.com 2019 - 2024. All rights reserved.