【问题标题】:Why does the time conversion depend on the date?为什么时间转换取决于日期?
【发布时间】:2021-07-23 05:25:15
【问题描述】:

我将时间作为"02:00:00" 存储在我的数据库中。但我想将这个时间显示为我的本地时区。

我尝试这样做以将时间从 UTC 转换为 Asia/Jakarta 时间:

package main
import (
    "fmt"
    "time"
)
func main() {
    layout := "15:04:05"
    inTimeStr := "02:00:00"
    loc, _ := time.LoadLocation("Asia/Jakarta")
    inTime, _ := time.Parse(layout, inTimeStr)
    fmt.Println(inTime)
    fmt.Println(inTime.In(loc).Format(layout))
}

我原以为这是09:00:00,但令人惊讶的是它是09:07:12

我尝试将时间的年份更改为不同的值,但得到了不同的结果。对我来说,如果我将年份设置为 1970 年或更多,它会给出正确的结果。

游乐场链接:https://play.golang.org/p/o0nj15CRHud

【问题讨论】:

标签: go time timezone


【解决方案1】:

time.Parse 返回Time (https://golang.org/pkg/time/#Time),它表示时间的瞬间(包括日期)。值中省略的元素假定为零,因此解析 02:00:00 时得到的时间是 0000-01-01 02:00:00 +0000 UTC

将年份设置为 1970 年或更多时,您会得到预期的结果,因为时区在历史上发生了变化(请参阅来自 Nate Eldredge 的评论)。

【讨论】:

    【解决方案2】:

    当您使用inTime.In 时,它会将时间(UTC 格式)转换为该时区。您应该使用ParseInLocation 而不是Parse 来解释给定位置的解析时间。

    【讨论】:

    • ParseInLocation 是一个很好的提示,但对于 OP 的示例,由于缺少日期(必须使用 LMT),这仍然会给出奇怪的输出 - playground ex
    猜你喜欢
    • 2013-09-22
    • 2017-08-21
    • 2019-07-23
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多