Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有Delphi EncodeDate/DecodeDate函数版本可以处理B.C.日期?_Delphi_Date_Encoding_Negative Number - Fatal编程技术网

是否有Delphi EncodeDate/DecodeDate函数版本可以处理B.C.日期?

是否有Delphi EncodeDate/DecodeDate函数版本可以处理B.C.日期?,delphi,date,encoding,negative-number,Delphi,Date,Encoding,Negative Number,Delphi函数EncodeDate/DecodeDate似乎只能处理1.1.0001之后的日期。是否有一些EncodeDate/DecodeDate实现可以处理B.C.tDateTime值?AFAIKtDateTime是一种Windows基本类型,常见于COM、Variants、DotNet和Delphi。负值可用于1899年之前的日期 但这并不是那么简单——因为负值会带来一些麻烦,比如: 整数部分是日期,小数部分是时间。日期,时间。 那很容易。当值为负值时,情况会变得奇怪。这是开着的还是开着

Delphi函数EncodeDate/DecodeDate似乎只能处理1.1.0001之后的日期。是否有一些EncodeDate/DecodeDate实现可以处理B.C.tDateTime值?

AFAIK
tDateTime
是一种Windows基本类型,常见于COM、Variants、DotNet和Delphi。负值可用于1899年之前的日期

但这并不是那么简单——因为负值会带来一些麻烦,比如:

整数部分是日期,小数部分是时间。日期,时间。 那很容易。当值为负值时,情况会变得奇怪。这是开着的还是开着的 1899年12月30日之前

正如你所怀疑的那样,随着现代日期的到来,时间总是向前流逝。 历史日期为负值时,时间实际上是倒转的! 午夜#1/1/1800#等于−36522,但正午(1800年1月1日)是−36522.5(小于 午夜!)午夜前一秒是−36522.9999884259(偶数 较少)。午夜时分,时钟向前跳至-36521,这意味着 等于#1/2/1800#。小数部分仍然显示时间和整数 部分是日期,但每一秒都会使时钟递减,而每一秒都是新的 一天增加它,不仅增加1,而且几乎增加2。消极时期是 真是违反直觉

更糟糕的是#12/30/1899#的时间值模棱两可 在两个方面。首先,没有日期的时间值等于该时间 1899年12月30日。这意味着0.5是正午或正午 在1899年12月30日,视上下文而定。零就是零 午夜、1899年12月30日或1899年12月30日午夜。另一个模棱两可的地方是这一切 时间值为#12/30/1899#的两倍。0.5是正午12/30/1899, 但是-0.5也是正午——1899年12月30日。不可分割的部分是日期, 分数就是时间。另一个惊喜是:1899年12月30日 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;

当计算持续时间或显示日期/时间时,您必须意识到“我们的时间”不是连续的。因此,使用
TDateTime=double
技巧进行计算并不总是像预期的那样有效。例如,我记得,就在天主教国家从儒略历改为公历时,要求将10月5日至14日从公历中删除。:)

嗯,好问题。是否有一个明确的日期日历?事实上,是否有一个定义良好的日期日历,该语句似乎与Delphi 2006安装中为
TDateTime
显示的帮助文本相矛盾。事实上,1899-12-30之前日期的日期值已经是负值,
EncodeDate
明确允许它们。
TDateTime
的帮助文本没有说明有效/支持的范围,只有
EncodeDate
似乎将范围限制在第1年之后的日期-这就是为什么我要求对Delphi的默认
EncodeDate/DecodeDate
函数进行一些扩展实现。我删除了我之前的注释,这当然是不正确的。但是,我怀疑TDateTime是否适用于1.1.0001以下的日期。不管怎样,你想用什么日历?我想这就足够了。但基本上这两个函数应该是对称的,调用
Date:=MyEncodeDate(-700,1,1)
后接
MyDecodeDate(Date,Year,Month,Day)
应该返回
Year=-700
Month=1
Day=1
,许多东欧国家在三十年代才改为格里高利。即使是1899-12-30之后的日期也不总是处处正确。当前的
EncodeDate
/
DecodeDate
的实现只适用于正值。如果您使用自己的日期类型/记录,那么我认为
月份:1..12;日期:1..31
可能更“pascalish”:)甚至可以为月份和日期定义特殊的枚举类型。有关julian和gregorian日期计算的更多信息可以在此处找到。我想,首先必须确定一个历史日期的背景。@TOndrej-那不是真的。使用Delphi,您可以使用负TDateTime值,最大值为-693593(0001年1月1日)。您应该理解,这些值对应于公历的前置,这是将公历扩展到过去的众多备选方案之一。@Serg我刚才说的是EncodeDate/DecodeDate。这与TDateTime本身可以用来存储负值这一事实无关(为什么不应该呢,毕竟它是Double的别名)。