Delphi 11.3中Ticks转TDateTime结果错误,求正确转换方法
Delphi中.NET风格Ticks转TDateTime的正确实现
你的问题核心是输入的Ticks是.NET标准格式(100纳秒为1单位,基准日期为0001-01-01),但原转换函数存在两个关键错误导致结果偏差:
错误点分析
- 整数除法丢失时间分数:
RemainingTicks div TicksPerDay是整数除法,结果始终为0,导致时间部分完全丢失。 - 基准日期处理错误:直接将天数加到0001-01-01上赋值给TDateTime,会因Delphi的TDateTime基准(1899-12-30)与0001-01-01的跨度太大,引发计算偏差。
修正后的转换函数
正确做法是先将Ticks转为基于.NET基准的浮点天数,再减去Delphi基准与.NET基准的天数差,得到符合TDateTime标准的值:
function TicksToDateTime(Ticks: Int64): TDateTime; const TICKS_PER_DAY = 864000000000; // 1天的Ticks数(100纳秒单位) // Delphi基准(1899-12-30)与.NET基准(0001-01-01)的天数差 DELPHI_TO_NET_BASE_DAYS = 693594.0; var NetDays: Double; begin // 将Ticks转为基于0001-01-01的天数(含小数时间部分) NetDays := Ticks / TICKS_PER_DAY; // 减去基准差,得到Delphi TDateTime(基准1899-12-30) Result := NetDays - DELPHI_TO_NET_BASE_DAYS; end;
验证结果
调用该函数处理638563016295520210这个Ticks值,格式化后会得到07/11/2024 9:33 AM,与预期一致。
时区补充说明
如果需要转换为EST时区,可在转换后使用TTimeZone类处理:
var LocalDT: TDateTime; begin LocalDT := TTimeZone.Local.ToLocalTime(TicksToDateTime(638563016295520210)); end;
内容的提问来源于stack exchange,提问作者Hackbrew
相关产品推荐
相关产品推荐

