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,完全匹配样本。
使用说明
- 从SQLite读取第3列的值时,确保将其转换为
Int64类型(数值超出32位整数范围)。 - 调用上述函数得到
TDateTime后,可使用DateToStr、FormatDateTime等Delphi日期函数格式化为需要的显示样式。
内容的提问来源于stack exchange,提问作者Steve F
相关产品推荐
相关产品推荐

