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

Delphi读取SQLite中datetime列数值转换为日期格式求助

解决Delphi中转换SQLite存储的.NET DateTime Ticks为TDateTime的问题

首先明确:你数据库中存储的数值是**.NET DateTime的Ticks值**,它的计数规则是从0001-01-01 00:00:00开始,每100纳秒(即1个Tick = 10^-7秒)累加。而Delphi的TDateTime是以1899-12-30 00:00:00为基准,以天为单位的浮点数,两者基准和单位都不同,所以直接用UnixToDateTime会出错。

转换步骤与Delphi实现

你可以通过以下函数将读取到的Ticks值转换为Delphi的TDateTime:

function NetTicksToDelphiDateTime(const Ticks: Int64): TDateTime;
const
  // 预计算:从0001-01-01到Delphi基准日(1899-12-30)的总秒数
  SECONDS_BETWEEN_EPOCHS = 63082281600;
  TICKS_PER_SECOND = 10000000; // 1秒=10^7 Ticks
var
  SecondsSince0001: Int64;
  SecondsSinceDelphiEpoch: Int64;
begin
  // 将Ticks转换为从0001-01-01开始的秒数
  SecondsSince0001 := Ticks div TICKS_PER_SECOND;
  // 计算从Delphi基准日开始的秒数
  SecondsSinceDelphiEpoch := SecondsSince0001 - SECONDS_BETWEEN_EPOCHS;
  // 转换为TDateTime(天为单位)
  Result := SecondsSinceDelphiEpoch / 86400;
end;

验证示例

用你提供的样本数据测试:

  • 输入Ticks:621939168000000000,转换后用DateToStr输出为11/7/1971,与样本一致。
  • 输入Ticks:633259296000000000,转换后输出9/21/2007,完全匹配样本。

使用说明

  1. 从SQLite读取第3列的值时,确保将其转换为Int64类型(数值超出32位整数范围)。
  2. 调用上述函数得到TDateTime后,可使用DateToStr、FormatDateTime等Delphi日期函数格式化为需要的显示样式。

内容的提问来源于stack exchange,提问作者Steve F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:39:14