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你。

当您将 和 的结果分配给a时StrToDateTime,它使用最匹配的运算符重载,其中 is 。StrToDateStrToTimeTValueImplicitTValueExtended

还要记住,TDateTime即使有运算符重载,所有三个函数都会返回TDateTimeTDate并且TTime它不会按预期工作。

要获得正确的结果,您必须在将值分配给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 在内部是如何形成的。

DateUtils
这些测试的健全版本是:

uses DateUtils;

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

TDateTime 与 Excel 兼容
0链接到微软 Excel 中的时代:1899 年 12 月 30 日;12:00 AM
(应该是 1-1-1900,但他们更改了它以弥补 Lotus 123 日期算法中的错误)
这很好,因为 DelphiTDateTime与 Excel 的 DateTime 完全兼容。

这是官方文档: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;

或者,您可以使用TryStrToDateTryStrToTimeTryStrToDateTime函数。

于 2013-10-03T18:10:14.697 回答