5

タイプ変数 TDateTime、TDate、および TTime を知る必要があります。

誰でもこれを行う方法を知っていますか?

以下のコードを使用しました。結果は「Is NOT TDateTime」、「Is NOT TDate」、「Is NOT Ttime」です。


program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Rtti,
  System.SysUtils;

var
  DateTime, Date,Time: TValue;

begin

  DateTime:= StrToDateTime( '01/01/2013 01:05:09' );
  if ( DateTime.TypeInfo = System.TypeInfo(TDateTime) ) then
    Writeln( 'Is TDateTime' )
  else
    Writeln( 'Is NOT TDateTime' );

  Date:=  StrToDate( '01/01/2015' );
  if ( Date.TypeInfo = System.TypeInfo(TDate) ) then
    Writeln( 'Is TDate' )
  else
    Writeln( 'Is NOT TDate' );

 Time:=  StrToTime( '01:01:02' );
  if ( Date.TypeInfo = System.TypeInfo(TTime) ) then
    Writeln( 'Is TTime' )
  else
    Writeln( 'Is NOT TTime' );

 Readln;

end.

ありがとう

4

3 に答える 3

5

Implicit演算子のオーバーロードTValueがあなたを手に入れました。

andの結果を aに代入するとStrToDateTime、isから最も一致する演算子のオーバーロードが使用されます。StrToDateStrToTimeTValueImplicitTValueExtended

TDateTimeまた、の演算子のオーバーロードがあったとしても、3 つの関数はすべて so を返し、期待どおりに動作しないことに注意しTDateTimeてくださいTDateTTime

TValue正しい結果を得るには、値を変数に割り当てるときに型を明示的に指定する必要があります。

DateTime := TValue.From<TDateTime>(StrToDateTime( '01.01.2013 01:05:09' ));

Date:= TValue.From<TDate>(StrToDate( '01.01.2015' ));

Time:= TValue.From<TTime>(StrToTime( '01:01:02' ));
于 2013-10-04T06:14:36.763 に答える
2

ご参考までに、TDateTime はDouble内部的に浮動小数点としてエンコードされます。

TDateTime の内部
小数部分は時刻を表し、整数部分は日付を表します。
これを知っていると、次のテストは と評価されtrueます。

dtTime: ABS(Double(DateTime1)) < 1.0 
dtDate: Trunc(Double(DateTime1)) = Double(DateTime1)
dtDateTime:  (     (ABS(Double(DateTime1)) > 1.0) 
         and (Trunc(Double(DateTime1)) <> Double(DateTime1)) )

明らかに、これは非常に回りくどいテスト方法ですが、TDateTime が内部でどのように形成されているかを知ることが役立つ場合があります。


これらのテストの正常なバージョンは次のようになります

uses DateUtils;

dtDate: DateTime1 = DateOf(DateTime1)
dtTime: DateTime1 = TimeOf(DateTime1)
dtDateTime:(DateTime1 <> DateOf(DateTime1)) and (DateTime1 <> TimeOf(DateTime1))

TDateTime は Excel と互換性があります
。この値0は、Microsoft の Excel のエポック (1899 年 12 月 30 日) にリンクしています。午前 12:00
(1900 年 1 月 1 日である必要がありましたが、Lotus の 123 日付アルゴリズムのエラーを補うために変更されました) Delphiは Excel の DateTime と完全に互換性がある
ため、これは素晴らしいことです。TDateTime

公式ドキュメントは次のとおりです: http://docwiki.embarcadero.com/Libraries/XE5//en/System.TDateTime

于 2013-10-04T01:28:47.897 に答える
2

StrToDateTime の結果の型を特定しようとしていた場合に備えて:

type
  TDateType = (dtDate, dtDateTime, dtTime);

function getDateType(date: TDateTime): TDateType;
begin
  if Trunc(date) = date then // Or DateOf(date), if available
  begin
    Result := dtDate;
  end
  else
  begin
    if Trunc(date) = 0 then // Or DateOf(date), if avaialble
    begin
      Result := dtTime
    end
    else
    begin
      Result := dtDateTime;
    end;
  end;
end;

// Sample
var
  result: TDateType;
begin
  result := getDateType(StrToDateTime('01/01/2013 01:05:09')); // dtDateTime
  result := getDateType(StrToDateTime('01/01/2015')); // dtDate
  result := getDateType(StrToDateTime('01:01:02')); // dtTime
  // One caveat
  result := getDateType(StrToDateTime('01/01/2013 00:00:00')); // dtDate
end;

または、、、および関数TryStrToDateを使用することもできます。TryStrToTimeTryStrToDateTime

于 2013-10-03T18:10:14.697 に答える