遇到TDate与TTime合并为TDateTime的问题,想想应该很容易,没想到发现一个百思不得其解的问题,在这里跟大家分享并求教。
比如有两个组件DateTimePicker1和DateTimePicker2,Kind属性分别为dtkDate和dtkTime,一个用来定义TDate值,一个用来定义TTime值,现在要将TDate与TTime合并为TDateTime,我首先想到的方法是以下语句:
NewDateTime: TDateTime; ... NewDateTime := Int(DateTimePicker1.Date) + Frac(DateTimePicker2.Time);
应该一句话解决问题的,但偏偏就出了问题,最终对NewDateTime的处理结果不对,可是调试将鼠标停在上述语句的NewDateTime上,明明结果正是DateTimePicker1.Date与DateTimePicker2.Time的字符串之和,很是奇怪。
于是,我有采用了另一种迂回方法达到目的,即以下语句:
NewDateTime: TDateTime; NewDateTimeStr: string; ... NewDateTimeStr := DateToStr(DateTimePicker1.Date)+' '+ TimeToStr(DateTimePicker2.Time); NewDateTime := StrToDateTime(NewDateTimeStr);
这次调试将鼠标停在上述语句的NewDateTime上,结果跟第一次的结果一样,都是DateTimePicker1.Date与DateTimePicker2.Time的字符串之和,但最终结果表明,这次的NewDateTime正确。
我对上述问题百思不得其解,虽最终用第2种方法达到了目的,但不明所以,在这里本人虚心请教,还望知道怎么回事的朋友告知。本人使用的是XE2 With Update 4 Hotfix 1。
以下代码证明了上述两种方法得到的不一样TDateTime的结果:
放入两个组件DateTimePicker1和DateTimePicker2,Kind属性分别为dtkDate和dtkTime;放入一个按钮,按钮的OnClick代码为:
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;
结果当然是不相等。
分别用DateOf和HourOf函数,再相加,更方便
应该不需要转换,直接:
NewDateTime := DateTimePicker1.Date + DateTimePicker2.Time;
测试了一下,是:
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;