Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How know type variable is TDateTime, TDate and TTime in Delphi

I need know type variable TDateTime, TDate and TTime.

Anyone have any idea how to do this?

I used the code below, the result is "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.

Thanks

like image 680
Johni Douglas Marangon Avatar asked Oct 03 '13 17:10

Johni Douglas Marangon


People also ask

What data type is date in Delphi?

Delphi Basics : TDateTime command. The TDateTime type holds a date and time value. It is stored as a Double variable, with the date as the integral part, and time as fractional part. The date is stored as the number of days since 30 Dec 1899.

How do you subtract dates in Delphi?

Delphi Basics : DaysBetween command. The DaysBetween function subtracts the FromDate from the ToDate, returning the number whole days difference. The time value of each date is taken account of - only whole 24 hour chunks are counted as whole days. A whole day does not have to start at 00:00:00.


2 Answers

The Implicit operator overloads of TValue got you.

When you assign the result of StrToDateTime, StrToDate and StrToTime to a TValue it uses the most matching Implicit operator overload from TValue which is Extended.

Also keep in mind that all three functions return TDateTime so even if there were operator overloads for TDateTime, TDate and TTime it would not work as expected.

To get the correct results you would have to explicitly specify the type when assigning your values to the TValue variables:

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' ));
like image 134
Stefan Glienke Avatar answered Oct 13 '22 01:10

Stefan Glienke


Just in case you were trying to determine the result type of 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;

Alternatively, you could use the TryStrToDate, TryStrToTime, and TryStrToDateTime functions.

like image 37
Marcus Adams Avatar answered Oct 13 '22 01:10

Marcus Adams