使用sqlx读取Oracle数据库时如何将本地时间自动转换为UTC时间
解决方案
以下两种方案都可以实现读取时自动转换,无需查询后手动处理字段:
方案1:SQL层面直接转换
直接在查询语句中通过Oracle内置函数完成时区转换,返回的结果已经是UTC时间,无需修改Go侧的代码逻辑:
如果你的时间字段带时区属性,直接调用SYS_EXTRACT_UTC函数即可:
SELECT SYS_EXTRACT_UTC(Scheduled_Time) AS Scheduled_Time FROM person WHERE 条件
如果字段是不带时区的DATE/TIMESTAMP类型,需要先指定存储时对应的数据库本地时区再转换:
-- 示例为数据库时区为东八区的情况,可根据实际时区替换'+08:00' SELECT SYS_EXTRACT_UTC(FROM_TZ(Scheduled_Time, '+08:00')) AS Scheduled_Time FROM person WHERE 条件
方案2:自定义时间扫描类型(适合大量字段复用的场景)
如果你不想修改所有涉及时间查询的SQL语句,可以封装一个自动转UTC的自定义时间类型,实现sql.Scanner接口,扫描时自动完成时区转换:
import ( "time" null "github.com/guregu/null/v4" ) // UTCTime 自定义UTC时间类型,继承null.Time的序列化、空值判断能力 type UTCTime null.Time // Scan 实现sql.Scanner接口,读取数据时自动转换为UTC时间 func (t *UTCTime) Scan(value interface{}) error { var baseNullTime null.Time if err := baseNullTime.Scan(value); err != nil { return err } if baseNullTime.Valid { baseNullTime.Time = baseNullTime.Time.UTC() } *t = UTCTime(baseNullTime) return nil }
替换原有结构体的字段类型即可:
type Person struct { ScheduledTime UTCTime `db:"Scheduled_Time" json:"scheduledTime"` }
后续所有需要自动转UTC的时间字段都可以直接使用UTCTime类型,无需额外处理。
内容的提问来源于stack exchange,提问作者Vinny
相关产品推荐
相关产品推荐

