web-dev-qa-db-ja.com

Delphi:TDatetime値を特定して空にする方法

割り当てる方法がないようです ヌル (「割り当てられていない値"からTDateTime変数へ。

私が想像した唯一の方法は、次のようなものを使用することです:

function isNull(aDate : TDateTime) : boolean;
const NullDate = 0.0;
var aNullDate : TDatetime;
    ms : Int64;
begin
  aNullDate := NullDate;
  ms := MilliSecondsBetween(aDate,aNullDate);
  result := (ms = Int64(0));
end;

日付値が0と重複しないより良い解決策を知っている人はいますか?

負のTDateTime値は危険ですか? (以前の目的のための有能なリソースとして)

16
xsubira

Andreasがすでに書いたように、 TDateTime タイプは実際にはdoubleであり、「null可能」ではありません。私が使う

const
  c_UnassignedDate = -693594;

空の日付値の場合、これは00/00/0000の不可能な日付を表すため。しかし、たとえばDevExpressは

NullDate = -700000;
InvalidDate = NullDate + 1;

したがって、標準の値に同意されていないようです。必要に応じて選択してください。

16
ain

最初に、「空のTDateTime値」によって意味を定義する必要があります。

TDateTime値は、整数部にエンコードされた日付と小数部にエンコードされた時刻を持つdoubleです。したがって、取得できる「null日付」に最も近いものは、おそらく0です。

したがって、単にADate <> 0をテストして、日付が「null」かどうかをテストします。

ただし、注意してください。TDateTimeローカル変数を宣言した場合、値を指定する前に、必ずしも=0になるとは限りません。何でもかまいません。もちろん、同じことがintegerdoubleboolean、...型の変数にも当てはまります。

また、値が0TDateTimeは、日付1899-12-30をエンコードすると思います。

最後に、負のTDateTime値は完全に正常です。たとえば、-50001886-04-22に対応します。

私はあなたのコードの要点をまったく理解していません。 「未割り当て」値として0を使用したい場合(1899-12-30に近い日付に興味がある場合は悪いことです)、なぜ単純にしないのですか?

function IsUnassigned(ADate: TDateTime): boolean;
begin
  result := ADate = 0;
end;

または、おそらく(ただし同等ではありません!)、

function IsUnassigned(ADate: TDateTime): boolean;
begin
  result := IsZero(Date);
end;

彼の答えでは、アインは「未割り当ての日付」の値にいくつかのより合理的な選択肢を与えました。

10

tDateTimeは、0から-1までの値に対しては未定義です。つまり、-0.5のtDateTimeは未定義の値であり、NaNの代わりにnullの日付に役立ちます。 DateTimeToStringは、+ 0.5と同じ-0.5を表示します。

1
John Hillier

TDateTimeの代わりにPDateTimeを使用し、nil値として送信します。値へのポインタがない場合、結果はありません。

値を確認するには、Assigned ptrを使用します。

MyDatePointer := nil;
if ( Assigned(MyDatePointer)) then ...
1
Eugene.LatDev

ライブラリのユニット_Spring.Persistence.Core.Session.pas_でSpring Framework for Delphihttp://www.spring4d.org )inメソッド_TSession.ExecuteScalar<T>_ NULLの場合、結果使用値Default(T);

あなたの機能は

_function IsNull(ADate: TDateTime): Boolean;
begin
  Result := ADate = Default(TDateTime);
end;
_
0
Nashev