1. 校准 Ubuntu 系统时间 / 时区
若系统时间本身和实际时间对不上,执行以下命令校准需同理校准时区 / 同步 NTP 时间):
# 1. 设置时区为上海(嵌入式设备常用时区)sudotimedatectl set-timezone Asia/Shanghai# 2. 安装时间同步工具(Ubuntu)sudoaptinstallntpdate -y# 3. 同步网络时间(嵌入式设备可对接NTP服务器,无网络则手动设置)sudontpdate pool.ntp.org# 验证时间是否正确date2. 解决时间戳差 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 语句)
- 插入数据时直接存 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- 更新数据时同步存 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