关于TDateTime的TDate与TTime合并的问题

24次阅读
3 条评论

遇到 TDate 与 TTime 合并为 TDateTime 的问题,想想应该很容易,没想到发现一个百思不得其解的问题,在这里跟大家分享并求教。

比如有两个组件 DateTimePicker1 和 DateTimePicker2,Kind 属性分别为 dtkDate 和 dtkTime,一个用来定义 TDate 值,一个用来定义 TTime 值,现在要将 TDate 与 TTime 合并为 TDateTime,我首先想到的方法是以下语句:

[delphi]
NewDateTime: TDateTime;

NewDateTime := Int(DateTimePicker1.Date) + Frac(DateTimePicker2.Time);[/delphi]

应该一句话解决问题的,但偏偏就出了问题,最终对 NewDateTime 的处理结果不对,可是调试将鼠标停在上述语句的 NewDateTime 上,明明结果正是 DateTimePicker1.Date 与 DateTimePicker2.Time 的字符串之和,很是奇怪。

于是,我有采用了另一种迂回方法达到目的,即以下语句:

[delphi]
NewDateTime: TDateTime;
NewDateTimeStr: string;

NewDateTimeStr := DateToStr(DateTimePicker1.Date)+’ ‘+ TimeToStr(DateTimePicker2.Time);
NewDateTime := StrToDateTime(NewDateTimeStr);[/delphi]

这次调试将鼠标停在上述语句的 NewDateTime 上,结果跟第一次的结果一样,都是 DateTimePicker1.Date 与 DateTimePicker2.Time 的字符串之和,但最终结果表明,这次的 NewDateTime 正确。

我对上述问题百思不得其解,虽最终用第 2 种方法达到了目的,但不明所以,在这里本人虚心请教,还望知道怎么回事的朋友告知。本人使用的是 XE2 With Update 4 Hotfix 1。

以下代码证明了上述两种方法得到的不一样 TDateTime 的结果:

放入两个组件 DateTimePicker1 和 DateTimePicker2,Kind 属性分别为 dtkDate 和 dtkTime;放入一个按钮,按钮的 OnClick 代码为:

[delphi]procedure TForm1.Button1Click(Sender: TObject);
var
NewDateTimeStr: string;
NewDateTime1, NewDateTime2: TDateTime;
begin
// 这样就错误
NewDateTime1 := Int(DateTimePicker1.Date) + Frac(DateTimePicker2.Time);
// 这样就正确
NewDateTimeStr := DateToStr(DateTimePicker1.Date)+’ ‘+TimeToStr(DateTimePicker2.Time);
NewDateTime2 := StrToDateTime(NewDateTimeStr);
if NewDateTime1 = NewDateTime2 then
ShowMessage(‘ 相等 ’)
else
ShowMessage(‘ 不相等 ’)
end;[/delphi]

结果当然是不相等。

正文完
 0
评论(3 条评论)
modisxp
2016-08-06 17:32:54 回复

分别用DateOf和HourOf函数,再相加,更方便

 Windows  Chrome  中国四川省绵阳市电信
A-Lao
2021-08-16 15:29:17 回复

应该不需要转换,直接:
NewDateTime := DateTimePicker1.Date + DateTimePicker2.Time;

 Windows  Chrome  中国广东省江门市电信
A-Lao
2021-08-16 16:05:50 回复

测试了一下,是:
var
dd: TDate;
tt: TTime;
begin
dd := Trunc(DateTimePicker1.Date);
tt := Frac(DateTimePicker2.Time);
Edit1.Text := FormatDateTime(‘yyyy-MM-dd HH:mm:ss’, dd + tt);
end;

 Windows  Chrome  中国广东省江门市电信