You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11.3中Ticks转TDateTime结果错误,求正确转换方法

Delphi中.NET风格Ticks转TDateTime的正确实现

你的问题核心是输入的Ticks是.NET标准格式(100纳秒为1单位,基准日期为0001-01-01),但原转换函数存在两个关键错误导致结果偏差:

错误点分析

  1. 整数除法丢失时间分数:RemainingTicks div TicksPerDay是整数除法,结果始终为0,导致时间部分完全丢失。
  2. 基准日期处理错误:直接将天数加到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:12:44