golang转换时间.时间到unix增加额外的小时

w8f9ii69  于 2023-05-27  发布在  Go
关注(0)|答案(2)|浏览(127)

我遇到了一个问题。PostgreSQL数据库以“不带时区的时间戳”格式存储日期和时间。如果您从数据库中获取日期和时间,并尝试将其转换为秒,则会增加4个额外的小时示例:

fmt.Println(menu.OpeningRecordAt, "|", time.Unix(menu.OpeningRecordAt.Unix(), 0))
// 2023-05-21 00:00:00 +0000 UTC | 2023-05-21 04:00:00 +0400 +04

有什么方法可以解决这个问题或更正确地转换日期和时间秒?
我试着将postgres的数据类型改为timestamp with time zone,但转换也增加了额外的时间

uinbv5nw

uinbv5nw1#

文件:
Package time

func Unix(sec int64, nsec int64) Time

Unix返回自1970年1月1日UTC以来与给定Unix时间、sec秒和nsec纳秒相对应的本地时间。
正如预期的那样,您获得了本地时间:2023-05-21 04:00:00 +0400。您需要UTC时间。

package main

import (
    "fmt"
    "time"
)

func main() {
    at, err := time.Parse("2006-01-02", "2023-05-21")
    fmt.Println(at, err)
    // got
    local := time.Unix(at.Unix(), 0)
    fmt.Println(local)
    // want
    utc := time.Unix(at.Unix(), 0).UTC()
    fmt.Println(utc)
}

美国东部夏令时(EDT):

2023-05-21 00:00:00 +0000 UTC <nil>
2023-05-20 20:00:00 -0400 EDT
2023-05-21 00:00:00 +0000 UTC
6pp0gazn

6pp0gazn2#

我能够用这种方法解决这个问题

tm := time.Date(
    menu.OpeningRecordAt.Year(),
    menu.OpeningRecordAt.Month(),
    menu.OpeningRecordAt.Day(),
    menu.OpeningRecordAt.Hour(),
    menu.OpeningRecordAt.Minute(),
    menu.OpeningRecordAt.Second(),
    menu.OpeningRecordAt.Nanosecond(),
    time.Local,
)

有更好的选择吗?

相关问题