Apps Script JDBC读取MySQL DATETIME字段出现8小时时区偏移如何解决
解决方案
你遇到的时区偏移问题是Google Apps Script内置MySQL JDBC驱动默认按服务器本地时区(UTC+8)解析DATETIME字段导致的,可通过以下两种方案修复,无需手动解析字符串:
方案1:JDBC连接参数指定时区
在JDBC连接URL末尾追加两个参数,强制驱动使用UTC时区解析时间类型:
// 修改连接URL,追加serverTimezone和useLegacyDatetimeCode参数 let conn = Jdbc.getConnection(`jdbc:mysql://${dbIp}/mydb?serverTimezone=UTC&useLegacyDatetimeCode=false`, { user: "myuser", password: dbPw })
参数说明:
serverTimezone=UTC:指定数据库服务端的时区为UTC,驱动会按照该时区解析DATETIME字符串useLegacyDatetimeCode=false:关闭旧版时间处理逻辑,确保serverTimezone参数生效
修改后再调用getTimestamp方法获取的时间戳就会和UNIX_TIMESTAMP返回的结果一致。
方案2:SQL直接返回时间戳绕开解析
完全绕开JDBC的时间类型解析逻辑,在查询时直接获取毫秒级时间戳:
SELECT UNIX_TIMESTAMP(COL) * 1000 AS col_unix_ts FROM MYTABLE WHERE OWNER_ID=1
查询后直接读取长整型数值构造Date对象即可:
const ts = res.getLong("col_unix_ts") const correctDate = new Date(ts)
该方案不受JDBC驱动配置影响,稳定性更高。
之前尝试不生效的原因
你之前给getTimestamp传入时区参数不生效,是因为驱动在读取DATETIME字段时已经按照错误的时区完成了时间戳计算,后续传入的时区参数无法修正已经生成的错误时间戳;useJDBCCompliantTimeZoneShift参数仅适配旧版JDBC规范的时间偏移逻辑,对MySQL驱动的时区解析问题无效。
内容的提问来源于stack exchange,提问作者Alex O'Brien
相关产品推荐
相关产品推荐

