12

Delphi 関数の EncodeDate/DecodeDate は、1.1.0001 以降の日付のみを処理できるようです。BC tDateTime 値を処理できる EncodeDate/DecodeDate の実装はありますか?

4

1 に答える 1

10

AFAIKTDateTimeは、COM、バリアント、DotNet、および Delphi に共通する Windows ベース タイプです。1899 年より前の日付には、負の値を使用できます。

しかし、それはそれほど単純ではありません-このページで述べられているように、負の値にはいくつかの問題があるためです:

整数部は日付、分数は時間です。日付時刻。簡単だ。値が負の場合、事態は奇妙になります。これは 1899 年 12 月 30 日以前です。

ご想像のとおり、現代の日付では時間が常に進みます。負の履歴日付を使用すると、実際には時間が逆になります。真夜中 #1/1/1800# は -36522 ですが、正午 #1/1/1800# は -36522.5 (真夜中よりも小さい!) であり、真夜中の 1 秒前は -36522.9999884259 (さらに小さい) です。真夜中に時計が -36521 に進みます。これは #1/2/1800# に相当します。小数部分は引き続き時刻を示し、整数部分は日付ですが、1 秒ごとに時計が減り、新しい日ごとに時計が 1 だけではなくほぼ 2 ずつ増えます。負の時間は実際には直観に反しています。

さらに悪いことに、#12/30/1899# の時間値は 2 つの点であいまいです。まず、日付のない時刻値は、#12/30/1899# の時刻と同じです。これは、コンテキストに応じて、0.5 が #12/30/1899# の正午または正午のいずれかであることを意味します。ゼロは真夜中 #12/30/1899# または真夜中 #12/30/1899# のいずれかです。もう 1 つのあいまいさは、#12/30/1899# のすべての時間値が 2 倍になることです。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;

また、期間について計算したり、日付/時刻を表示したりするときは、「私たちの時間」が連続していないことに注意する必要があります。TDateTime=doubleそのため、トリックを使用した計算は常に期待どおりに機能するとは限りません。たとえば、アビラのテレサが 1582 年 10 月 4日に亡くなったことを覚えています。丁度、カトリック諸国がユリウス暦からグレゴリオ暦への切り替えを行っていた時期でした。:)

于 2011-07-28T10:01:26.787 に答える