Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi中,如何知道类型变量是TDateTime、TDate和TTime_Delphi_Rtti_Tdatetime - Fatal编程技术网

在Delphi中,如何知道类型变量是TDateTime、TDate和TTime

在Delphi中,如何知道类型变量是TDateTime、TDate和TTime,delphi,rtti,tdatetime,Delphi,Rtti,Tdatetime,我需要知道类型变量TDateTime、TDate和TTime 有人知道怎么做吗 我使用了下面的代码,结果是“is NOT TDateTime”、“is NOT TDate”、“is NOT Ttime” 感谢您,以防您试图确定StrToDateTime的结果类型: type TDateType = (dtDate, dtDateTime, dtTime); function getDateType(date: TDateTime): TDateType; begin if Trunc(

我需要知道类型变量TDateTime、TDate和TTime

有人知道怎么做吗

我使用了下面的代码,结果是“is NOT TDateTime”、“is NOT TDate”、“is NOT Ttime”


感谢您,以防您试图确定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
TryStrToTime
TryStrToDateTime
函数。

如果您好奇,TDateTime在内部被编码为浮点
双精度

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)) )
dtTime:ABS(双精度(DateTime1))<1.0
dtDate:Trunc(Double(DateTime1))=Double(DateTime1)
dtDateTime:((ABS(Double(DateTime1))>1.0)
和(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))
使用DateUtils;
dtDate:DateTime1=DateOf(DateTime1)
dtTime:DateTime1=TimeOf(DateTime1)
dtDateTime:(DateTime1 DateOf(DateTime1))和(DateTime1 TimeOf(DateTime1))
TDateTime与Excel兼容
0
链接到Microsoft Excel中的时代:1899年12月30日;上午12:00
(应该是1-1-1900,但他们更改了它以补偿Lotus123日期算法中的错误)
这很好,因为Delphi的
TDateTime
与Excel的DateTime完全兼容


这是官方文件:

TValue
隐式
运算符重载得到了您的支持

当您将
strotdatetime
strotdate
strottime
的结果分配给
TValue
时,它使用了
TValue
中最匹配的
隐式
运算符重载,该重载是
扩展的

还请记住,所有三个函数都返回
TDateTime
,因此即使
TDateTime
TDate
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' ));
DateTime:=TValue.From(strotdatetime('01.01.2013 01:05:09');
日期:=TValue.From(StrToDate('01.01.2015'));
时间:=TValue.From(strotime('01:01:02');

也许您可以尝试按照答案进行操作。欢迎使用堆栈溢出。这是非常好的,你包括你期望得到的结果,但它也有助于报告你得到了什么结果。你知道你没有得到一个TDateTime,所以进一步调查,找出你得到的是什么类型的。另外请注意,StrToDateTime、StrToDate和StrToTime都返回TDateTime,因此不要对它们的区别抱有太大希望。类型是
TDateTime
,总是。不,类型是
扩展的
总是-请参阅下面的答案。我同意,在可用的情况下使用@DavidHeffernan更具描述性。“没有负面日期!”显然,我们没有相同的约会经历你不能选择是否使用-ve日期-你要么需要表示1900年之前的日期,要么不需要。不过,我可以看出时间段是多么令人困惑。@MattAllwood您当然可以自己滚动,但不要期望RTL支持(DateToStr)等。哦,1900年之前的日期是复杂的。参见维基百科-1,说明没有负面日期。有,它们的功能非常好。您链接的文档甚至明确指出,
-1.25
是1899年12月29日;早上6:00现在-1.25+0.25加起来是什么。。。嗯,-1当然。是的,就在6个小时前:1989年12月30日午夜。没什么复杂的。完全正常。这是可以预料到的,否则我们将永远无法对1989年12月30日之前的日期做任何事情,家谱程序也不需要在Delphic中编程。我承认用时间分数计算时有点复杂。在零的两侧,时间从零开始增加,这似乎是“关闭”的,因为您希望时间分数从左向右移动,就像日期在零以下一样。事实上,时间分数与日期“相反”的增加实际上是为了使计算正确进行。哇,
Extended
!新的Emba-RTL代码仍然使用
Extended
,这一事实让我无法接受。将日期时间放入扩展的
中简直是疯了。将它们存储在二进制浮点(!!)中已经够糟糕的了。呸!“问题”在于,浮点数的TValue的唯一匹配隐式运算符重载被扩展,这破坏了TDateTime/TTime/TDate/任何其他浮点类型的兼容性(即,能够随后确定类型)。虽然它主要通过这些类型体现出来,但对于任何其他类型来说,TValue中没有特定的隐式运算符重载,但赋值兼容任何具有重载的类型也是如此。我只是喜欢任何抱怨
扩展
的机会,这本不应该存在,而
TDateTime
是浮点。一个同时发出两声哀鸣的机会太诱人了,不容错过!;-)
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' ));