在Delphi中,如何知道类型变量是TDateTime、TDate和TTime
我需要知道类型变量TDateTime、TDate和TTime 有人知道怎么做吗 我使用了下面的代码,结果是“is NOT TDateTime”、“is NOT TDate”、“is NOT 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(
感谢您,以防您试图确定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' ));