ctlayout
const ctLayout = "2006-01-02T15:04:05"
const RFC3339 = "2006-01-02T15:04:05Z07:00"
从此blogpost。
在 RFC 3339 中,我们也可以从格式中知道时区。它 以“Z”语法显示。 “Z”表示UTC+0。 “Z”代表祖鲁语 时区与 GMT 或 UTC 相同 (https://stackoverflow.com/a/9706777/4075313)。所以如果我们把 Z 放在 DateTime,表示它的时区是UTC+0。
'Z'
这是重构的代码。您可以在 playground 上找到工作代码。
timeToInsertInDB := "2006-01-02T15:04:05" + "Z"
testTime,err := time.Parse(time.RFC3339,timeToInsertInDB)
if err != nil {
fmt.Println(err)
}
注意:- 更详细的时区示例
2019-10-12T07:20:50.52Z (UTC+0)
2019-10-12T07:20:50.52+00:00 (UTC+0)
2019-10-12T14:20:50.52+07:00 (UTC+7)
2019-10-12T03:20:50.52-04:00 (UTC-4)
time.Time
编辑 1
database/sqlgithub.com/lib/pq
正如 Brits 所提到的,这很可能是因为您的代码中存在逻辑错误(但无法确认这一点,因为您没有共享代码)。
,你的问题很难回答,因为它目前没有足够的信息让我复制这个问题。
time.Time
time.Timetime.Time
下面的代码演示了这一点(并且在我使用 Postgres 13.1 时成功完成) - 此代码使用 Shailesh Suryawanshi 建议的技术从 JSON 转换:
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
"time"
)
func main() {
db,err := sql.Open("postgres","DSN goes here")
if err != nil {
panic(err)
}
defer db.Close()
// Create the table (would not normally do this here but this means the demo is self contained)
_,err = db.Exec("create temporary table db(created_timestamp timestamp with time zone)")
if err != nil {
panic(err)
}
jsonTS := `2021-07-19T18:51:23`
ts,jsonTS+"Z")
if err != nil {
panic(err)
}
_,err = db.Exec("INSERT INTO db (created_timestamp) VALUES ($1)",ts)
if err != nil {
panic(err)
}
// Test retrieving the value
rows,err := db.Query("select * from db")
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
var t time.Time
err = rows.Scan(&t)
if err != nil {
panic(err)
}
fmt.Println(t)
}
fmt.Println("Complete")
}
db.Exec("INSERT INTO db (created_timestamp) VALUES ($1)","")
panic: pq: invalid input syntax for type timestamp with time zone: ""
您的问题可能是由 Postgres 配置中的某些内容引起的;对您的服务器运行上述代码的修改版本将使您能够确认是否是这种情况。但是,根据上述情况,我认为最可能的原因是您的代码中存在逻辑错误(但无法确认,因为您没有共享代码)。
lib/pq