SQL查询Chrome历史库转换Chromium时间戳为含毫秒可读时间方案
Chromium时间戳转换错误修复方案
错误原因
- 年份计算偏差:原语句用
strftime('%s', '1601-01-01')计算纪元偏移时未加utc修饰符,会按本地时区计算基准秒数,叠加部分SQLite版本对早期时间的时区规则计算异常,导致偏移量计算错误,最终年份错位。 - 无小数秒输出:SQLite内置
datetime()函数仅支持秒级精度输出,且原语句直接做整数除法丢弃了微秒余数,无法保留毫秒/百分秒部分。
正确SQL实现
以下语句可直接输出符合dd/mm/yyyy hh:mm:ss.ss要求的时间格式,和示例14/06/2022 10:05:30.25完全匹配:
SELECT u.url AS URL, u.title AS Title, u.visit_count AS "Visit Count", strftime('%d/%m/%Y %H:%M:%S', (u.last_visit_time / 1000000) - 11644473600, 'unixepoch', 'localtime' ) || '.' || printf('%02d', (u.last_visit_time % 1000000) / 10000) AS "Last Visited Date Time", strftime('%d/%m/%Y %H:%M:%S', (v.visit_time / 1000000) - 11644473600, 'unixepoch', 'localtime' ) || '.' || printf('%02d', (v.visit_time % 1000000) / 10000) AS "Visited Date Time" FROM urls u, visits v WHERE u.id = v.url
关键逻辑说明
- Chromium时间戳以微秒为单位,纪元起点为1601-01-01 00:00:00 UTC,其与Unix纪元(1970-01-01 00:00:00 UTC)的固定秒差为11644473600,直接使用固定值计算可彻底避免时区、SQLite版本差异导致的基准偏移问题。
- 小数秒部分通过取余运算
% 1000000提取剩余微秒,除以10000后得到两位百分秒数值,用printf('%02d')补前导零后拼接在秒级时间后,即可得到要求的两位小数秒格式。 - 若使用3.38.0以下版本的SQLite,
unixepoch修饰符不支持负数时间戳,可将时间戳计算部分替换为u.last_visit_time / 1000000 + strftime('%s', '1601-01-01', 'utc'),转换效果完全一致。
内容的提问来源于stack exchange,提问作者PF6004
相关产品推荐
相关产品推荐

