ble*_*tin 12 delphi encoding date negative-number
Delphi函数EncodeDate/DecodeDate似乎只能处理1.1.0001之后的日期.是否有一些可以处理BC tDateTime值的EncodeDate/DecodeDate实现?
Arn*_*hez 10
AFAIK TDateTime是Windows基本类型,COM,Variants,DotNet和Delphi共有.负值可用于1899年之前的日期.
但这并不是那么简单 - 因为负值会带来一些麻烦,如本页所述:
整数部分是日期,分数是时间.约会时间.这很简单.当值为负时,事情变得奇怪.这是#12/30/1899#或之前.
随着现代日期,时间总是向前延伸,正如您所怀疑的那样.由于负历史日期,时间实际上倒退了!午夜#1/1/1800#等于-36522,但中午#1/1/1800#是-36522.5(小于午夜!),午夜前一秒是-36522.9999884259(甚至更少).午夜时钟跳到-36521,相当于#1/2/1800#.小数部分仍然显示时间,而积分部分是日期,但每一秒减少时钟,而每个新的一天递增它,不仅仅是1,而是几乎2.负面的时间实际上是违反直觉的.
更糟糕的是,#12/30/1899#的时间价值在两个方面是不明显的.首先,没有日期的时间值等于#12/30/1899#的时间.这意味着0.5是#12/30/1899#中午或中午,具体取决于具体情况.零点是午夜,#12/30/1899#或午夜#12/30/1899#.另一个含糊之处在于#12/30/1899#的所有时间值都是双倍的.0.5是中午#12/30/1899#,但-0.5也是#12/30/1899#中午#.整数部分是日期,分数是时间.另一个惊喜在于:#12/30/1899 11:59:59 PM# - #12/29/1899 11:59:59 PM#= 2.99997685185185.不是1,你通常会期望24小时.使用历史日期时要小心.
据我所知,EncodeDate/DecodeDate的当前实现将起作用,但在使用负值或接近零TDateTime值时可能会遇到麻烦......
您最好使用自己的时间格式,例如ISO-8601或简单记录:
TMyDateTime = packed record
Year: SmallInt;
Month: Byte;
Day: Byte;
end;
Run Code Online (Sandbox Code Playgroud)
在计算有关持续时间或显示日期/时间的事情时,您必须意识到"我们的时间"不是连续的.因此使用该TDateTime=double技巧的计算并不总是按预期工作.例如,我记得阿维拉的特雷莎于1582年10月4日去世,正如天主教国家正在从朱利安历法转变为格里高利历,这要求将10月5日至14日从日历中删除.:)