SQLite3学习笔记3:UTC和CST 时区偏差问题
2026/8/6 10:42:00 网站建设 项目流程

1. 校准 Ubuntu 系统时间 / 时区

若系统时间本身和实际时间对不上,执行以下命令校准需同理校准时区 / 同步 NTP 时间):

# 1. 设置时区为上海(嵌入式设备常用时区)sudotimedatectl set-timezone Asia/Shanghai# 2. 安装时间同步工具(Ubuntu)sudoaptinstallntpdate -y# 3. 同步网络时间(嵌入式设备可对接NTP服务器,无网络则手动设置)sudontpdate pool.ntp.org# 验证时间是否正确date

2. 解决时间戳差 8 小时的问题

SQLite3 的CURRENT_TIMESTAMP默认生成的是UTC 时间(世界协调时间),而 Ubuntu 系统显示的是CST 时间(中国标准时间,UTC+8),所以数据库中记录的时间会比本地时间少 8 小时。

  • 数据库时间:2026-01-26 10:15:46(UTC)
  • 本地时间:2026-01-26 18:15:46(CST = UTC+8)
方案 1:查询时转换时区

核心逻辑:原始数据存 UTC(国际标准,便于跨时区设备溯源),查询时转换为 CST(UTC+8)。

// 原查询语句SELECT*FROMdevice_params;// 新查询语句(转换为CST时间)SELECTid,param_name,param_value,datetime(update_ts,'+8 hours')ASupdate_ts_cstFROMdevice_params;

结果如下:

// UTC1|temp|26.0|2026-01-2610:15:462|humidity|60.2|2026-01-2610:15:46// CST1|temp|26.0|2026-01-2618:15:462|humidity|60.2|2026-01-2618:15:46
方案 2:插入 / 更新时直接存 CST 时间

核心逻辑:插入 / 更新时显式指定时区偏移,让update_ts直接存储 CST 时间 —— 适合仅在国内使用、无需跨时区的嵌入式设备。

操作步骤(修改 INSERT/UPDATE 语句)
  1. 插入数据时直接存 CST
// 原插入语句(存UTC)INSERTINTOdevice_params(param_name,param_value)VALUES('temp',26.5),('humidity',61.0);// 新插入语句(存CST,显式+8小时)INSERTINTOdevice_params(param_name,param_value,update_ts)VALUES('temp',26.5,datetime(CURRENT_TIMESTAMP,'+8 hours')),('humidity',61.0,datetime(CURRENT_TIMESTAMP,'+8 hours'));

结果如下:

// UTC3|temp|26.5|2026-01-2611:03:554|humidity|61.0|2026-01-2611:03:55// CST5|temp|26.5|2026-01-2619:04:166|humidity|61.0|2026-01-2619:04:16
  1. 更新数据时同步存 CST
// 原更新语句(存UTC)UPDATEdevice_paramsSETparam_value=27.0,update_ts=CURRENT_TIMESTAMPWHEREparam_name='temp';// 新更新语句(存CST)UPDATEdevice_paramsSETparam_value=27.0,update_ts=datetime(CURRENT_TIMESTAMP,'+8 hours')WHEREparam_name='temp';

结果如下:

// UTC1|temp|27.0|2026-01-2611:14:133|temp|27.0|2026-01-2611:14:135|temp|27.0|2026-01-2611:14:13// CST1|temp|27.0|2026-01-2619:14:183|temp|27.0|2026-01-2619:14:185|temp|27.0|2026-01-2619:14:18

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询