在DateTime中,仅使用64位中的62位。负值不在规范中。如何代表公元前的日期?

时间:2019-04-14 06:59:16

标签: .net datetime

使用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 BC的日期?

(2)这2位是否保留给我不知道的东西?

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

1 个答案:

答案 0 :(得分:4)

前两位用于“种类”:

  • 本地
  • UTC
  • 未指定
  • “对歧义案件具有特殊知识的地方”

请参见my blog post for more information on this。诚然,“种类”仅是在.NET 1.1(IIRC)中引入的;我怀疑在此之前的范围限制仅仅是实用主义的问题。当您决定处理早于0001-01-01的值时,会出现各种实际问题,而且我怀疑.NET设计人员认为,这些问题对开发人员的伤害要大于对需要的开发人员数量的伤害。 em>较大的日期范围。

关于如何处理较早的日期,除非绝对必要,否则我强烈建议反对编写自己的日期/时间代码。我个人会推荐我的Noda Time库。 handles的日期范围为[9999BC,9999AD],并且具有十亿分之一秒的精度,并且支持IANA time zone database