为什么Delphi在存储日期和时间时使用双精度浮点数(8字节),而不是Int64(同样是8字节)?由于双精度浮点数并非精确值,我很好奇以Unix日期和时间存储在Int64值中的精度是否比Delphi日期和时间更高?
为什么Delphi在存储日期和时间时使用双精度浮点数(8字节),而不是Int64(同样是8字节)?由于双精度浮点数并非精确值,我很好奇以Unix日期和时间存储在Int64值中的精度是否比Delphi日期和时间更高?
简单来说,Delphi的TDateTime
类型与OLE/COM日期时间格式直接对应。
Embarcadero选择使用现有的日期/时间表示而不是创建另一个,并选择当时最明显的本地平台选项。
有关Windows日期/时间表示的两篇有用文章:
就精度而言,您可以将Unix时间与TDateTime
进行比较。32位或64位值的Unix时间均具有秒精度。对于接近起源的值,双倍精度要高得多。一天有86,400秒,在0和1之间,存在许多数量级更高的双倍值。需要到约188143673年才能超过TDateTime
的Unix时间精度。
尽管您已经关注了类型的大小,但表示当然至关重要。例如,如果将日期表示为距离纪元后的毫秒数,Unix时间的精度将增加1000倍。当然,范围也会减少1000倍。
您需要注意考虑这些类型的精度时的相关因素。这些类型并不是孤立存在的,值的来源很重要。如果时间来自文件系统,那么这实际上将确定值的精度。
Int64
提供支持,而TDateTime
则早于它。因此,在集成和稳定Int64
支持的时候,改变TDateTime
已经太晚了,这样做会有破坏代码的风险。 - Remy Lebeau
DateUtils
提供了执行此类操作的工具。顺便说一句,整数反映日期,小数反映当天时间。但是关于为什么,你得问原始开发人员,我怀疑他们不会来这里回答。 - Jerry DodgeTDateTime
的精度取决于绝对值的大小而有显著差异。在时代接近时有很好的细粒度,但是随着远离时代,它会逐渐变得更加粗糙。这是使用浮点类型的直接后果。 - David Heffernan