xorm 条件查询时区的问题
阅读原文时间:2023年07月08日阅读:3

问题描述:如果在查询的时候,直接传时间格式作为条件,时间会被驱动程序转为UTC格式,因此会有8个小时的误差。

解决方案1:

将查询时间转为字符串

db.where("time > ?",  time.Now().Fomart("2006-01-02 15:04:05")).Get(&bean)

解决方案2:

连接字符串增加loc=Asia%2fShanghai

func initEngine(cfg *config.Config) *xorm.Engine {

dial := fmt.Sprintf("%v:%v@tcp(%v)/%v?charset=utf8&loc=%v", cfg.Mysql.Username,

cfg.Mysql.Password, cfg.Mysql.HostPort, cfg.Mysql.DBName, "Asia%2fShanghai")

engine, err := xorm.NewEngine("mysql", dial)

if err != nil {

panic(err)

}

engine.SetMaxOpenConns(cfg.Mysql.MaxConns)

engine.SetMaxIdleConns(cfg.Mysql.MaxIdle)

engine.ShowSQL(true)

engine.SetLogger(xorm.NewSimpleLogger(os.Stdout))

engine.Logger().SetLevel(core.LOG_DEBUG)

engine.SetMapper(core.GonicMapper{})

engine.SetTZLocation(time.Local)

return engine

}

参考源码:
github.com/go-sql-driver/mysql/dsn.go
github.com/go-sql-driver/mysql/packets.go