为什么Delphi使用double存储日期和时间而不是Int64?

11

为什么Delphi在存储日期和时间时使用双精度浮点数(8字节),而不是Int64(同样是8字节)?由于双精度浮点数并非精确值,我很好奇以Unix日期和时间存储在Int64值中的精度是否比Delphi日期和时间更高?


1
如果我没记错的话,精度只与操作有关,这就是为什么DateUtils提供了执行此类操作的工具。顺便说一句,整数反映日期,小数反映当天时间。但是关于为什么,你得问原始开发人员,我怀疑他们不会来这里回答。 - Jerry Dodge
2
@JerryDodge 精度实际上非常重要,因为 TDateTime 的精度取决于绝对值的大小而有显著差异。在时代接近时有很好的细粒度,但是随着远离时代,它会逐渐变得更加粗糙。这是使用浮点类型的直接后果。 - David Heffernan
@David 确实,我并不是说它们不相关 - 只是想指出一下。 - Jerry Dodge
@RudyVelthuis 我想我在我的回答中已经回答了这个问题。 - David Heffernan
@David:是的,间接地你确实做到了。 - Rudy Velthuis
显示剩余2条评论
1个回答

23

简单来说,Delphi的TDateTime类型与OLE/COM日期时间格式直接对应。

Embarcadero选择使用现有的日期/时间表示而不是创建另一个,并选择当时最明显的本地平台选项。

有关Windows日期/时间表示的两篇有用文章:

就精度而言,您可以将Unix时间与TDateTime进行比较。32位或64位值的Unix时间均具有秒精度。对于接近起源的值,双倍精度要高得多。一天有86,400秒,在0和1之间,存在许多数量级更高的双倍值。需要到约188143673年才能超过TDateTime的Unix时间精度。

尽管您已经关注了类型的大小,但表示当然至关重要。例如,如果将日期表示为距离纪元后的毫秒数,Unix时间的精度将增加1000倍。当然,范围也会减少1000倍。

您需要注意考虑这些类型的精度时的相关因素。这些类型并不是孤立存在的,值的来源很重要。如果时间来自文件系统,那么这实际上将确定值的精度。


1
此外,据我所知,早期版本的Delphi几乎没有对Int64提供支持,而TDateTime则早于它。因此,在集成和稳定Int64支持的时候,改变TDateTime已经太晚了,这样做会有破坏代码的风险。 - Remy Lebeau
@remy 当时Unix时间是32位。 - David Heffernan
@Remy:虽然这是真的,但他们本可以使用一个包含两个Cardinals的记录。如果像“1987年2月16日23:37:09.123”这样的日期时间被存储为两个Cardinals,即“19870216”和“233709123”,那将很容易适应(最大Cardinal为“4294967295”),并且仍具有巨大的范围。它需要一些除法或乘法来使用10的幂,但这仍然比使用双精度浮点数更容易。因此,我认为唯一的原因是与COM的兼容性相关。 - Rudy Velthuis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接