Golang中国

字段created_at 在PG中类型为timestamp without timezone

lib/pq 解析此时间类型时会解析为UTC时间,但我存储的时间为localtime

PG对timewithout timezone 的处理为:

SELECT a, b, a = b, a < b, a > b FROM (VALUES ('2015-02-13T04:05:06'::timestamp, '2015-02-13T04:05:06+08:00'::timestamptz)) AS x(a,b);
          a          |           b            | ?column? | ?column? | ?column?
---------------------+------------------------+----------+----------+----------
 2015-02-13 04:05:06 | 2015-02-13 04:05:06+08 | t        | f        | f
(1 row)

以下是lib/pg处理的demo code,和返回

package main

import (
    "database/sql"
    "fmt"
    "time"

    _ "github.com/lib/pq"
)

func main() {
    db, err := sql.Open("postgres", "user=user dbname=db sslmode=disable")
    if err != nil {
        fmt.Println(err)
    }

    rows, err := db.Query("SELECT created_at FROM orders WHERE id=73207")
    for rows.Next() {
        var created_at time.Time
        err = rows.Scan(&created_at)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(created_at)
    }
}

// DB value  2016-12-26 21:34:34.548679
//OUTPUT 2016-12-26 21:34:34.548679 +0000 +0000

Github上面有过此问题的讨论,但最终并没有什么结论,Orz ….

https://github.com/lib/pq/issues/329

大家有遇到过此问题么,请教一下如果要默认获取为localtime,可以如何解决

1 回复
joe9i0
#1 joe9i0 • 2016-12-28 15:54

记录时间的字段不要使用数据库内置的时间类型

  • 操作系统时区配置
  • 数据库时区配置
  • 数据源连接参数配置
  • 前后端时区同步配置

以上各种配置不一致导致各种时间问题,各种坑

推荐方案就是用 Unix Time记录时间, 数据库字段类型使用 bigint

需要计算时间的地方直接使用数字计算, 需要显示的地方直接将Unix转换一下就行了.

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。