Delphi 10.4 CE日期格式问题及IncDay函数异常修复求助
Delphi 10.4 CE 日期格式问题解决方案
问题1:DateTime字段调用IncDay后显示01/09/1900
原因:当leavestart字段为空时,AsDateTime会返回TDateTime的0值(对应1899-12-30),调用IncDay(0,10)计算后得到1900-01-09,这就是错误日期的来源。
解决方法:先判断字段是否为空,仅在非空时执行日期计算:
if not tblLeaveAzr.FieldByName('leavestart').IsNull then tblLeaveAzr.FieldByName('leaveend').AsDateTime := IncDay( tblLeaveAzr.FieldByName('leavestart').AsDateTime, tblLeaveAzr.FieldByName('leavedays').AsInteger ) else tblLeaveAzr.FieldByName('leaveend').Clear; // 清空目标字段或设置业务默认值
问题2:Date字段调用IncDay出现日期格式错误
原因:SQL Server的Date类型对应Delphi的TDate,若leavestart字段为空,直接调用AsDateTime会触发类型转换异常;另外leavedays字段为空或非整数时,也会导致计算失败。
解决方法:同时校验日期字段和天数字段的有效性,改用AsDate处理Date类型字段更适配:
if (not tblLeaveAzr.FieldByName('leavestart').IsNull) and (not tblLeaveAzr.FieldByName('leavedays').IsNull) then tblLeaveAzr.FieldByName('leaveend').AsDate := IncDay( tblLeaveAzr.FieldByName('leavestart').AsDate, tblLeaveAzr.FieldByName('leavedays').AsInteger ) else tblLeaveAzr.FieldByName('leaveend').Clear;
问题3:日期显示格式重启后变更
原因:DB控件的日期显示默认依赖系统区域设置,若未固定DataSet字段的显示格式,重启应用后会被系统设置覆盖。
解决方法:手动为日期字段设置固定的DisplayFormat和EditFormat,可在设计时(字段编辑器中配置)或代码中实现:
procedure TForm1.tblLeaveAzrAfterOpen(DataSet: TDataSet); begin with tblLeaveAzr do begin FieldByName('leavestart').DisplayFormat := 'dd/mm/yyyy'; FieldByName('leavestart').EditFormat := 'dd/mm/yyyy'; FieldByName('leaveend').DisplayFormat := 'dd/mm/yyyy'; FieldByName('leaveend').EditFormat := 'dd/mm/yyyy'; end; end;
额外提示:若使用ADO连接,可检查
TADOConnection的LocaleID属性确保区域一致性,但手动设置字段格式优先级更高,不受系统环境干扰。
内容的提问来源于stack exchange,提问作者GKIT
相关产品推荐
相关产品推荐

