【问题标题】:How to format a local time object in Go with correct minutes?如何用正确的分钟格式化 Go 中的本地时间对象?
【发布时间】:2015-09-25 13:17:23
【问题描述】:

编辑:我已经用代码更新了问题,强调了为什么所谓的重复的解决方案对我不起作用

我正在尝试采用 UTC (+0000) 时间并将它们格式化为当地时间(在我的情况下为东部时间),而不对任何时区偏移进行硬编码(以避免实施 dst 校正)。

我有以下代码来演示我遇到的问题

package main

import (
    "fmt"
    "time"
)

func main() {
    // Here I load the timezone
    timezone, _ := time.LoadLocation("America/New_York")

    // I parse the time
    t, _ := time.Parse("Mon Jan 2 15:04:05 +0000 2006", "Tue Jul 07 10:38:18 +0000 2015")

    // This looks correct, it's still a utc time
    fmt.Println(t)
    // 2015-07-07 10:38:18 +0000 UTC

    // This seems to be fine - -4 hours to convert to est
    t = t.In(timezone)
    fmt.Println(t)
    // 2015-07-07 06:38:18 -0400 EDT

    // This prints 6:07am, completely incorrect as it should be 6:38am
    fmt.Println(t.Format("Monday Jan 2, 3:01pm"))
    // Tuesday Jul 7, 6:07am
}

(https://play.golang.org/p/e57slFhWFk)

所以对我来说,它似乎可以很好地解析和转换时区,但是当我使用格式输出它时,它会摆脱分钟并使用 07。不管我将分钟设置为什么,它总是会出现07.

【问题讨论】:

  • 标记副本中的两个答案都包含您的解决方案(使用Time.In())。
  • 另一个问题是关于如何创建一个新时间而不是解析到我试图用 ParseInLocation 做的时区
  • 您正在打印没有位置的时间。您可以使用.Println(t.Format("Monday Jan 2, 3:01pm (MST)")) 打印带有位置信息的时间。 t.UTC() 也有效。你的数学是颠倒的。 // This looks correct, 20 - 0400 = 16 = 4pm 需要加上时间才能得到UTC时间。所以 UTC 时间是第二天凌晨 12 点,而不是 UTC 减 8 Updated playground link 另请参阅time.In() 的链接答案
  • 我的数学无法逆转...我用了twitter返回的日期是下午4点,twitter的日期是8pm +0000,然后golang转换成8pm -0400
  • @icza 我已经更新了解释我遇到的确切问题的问题,包括“重复”的解决方案,这对我不起作用。

标签: time go


【解决方案1】:

您的布局(格式)字符串不正确。正如time 包的文档中所述,布局字符串必须表示这个时间:

Mon Jan 2 15:04:05 MST 2006

解析时,使用如下格式字符串:

t, _ := time.Parse("Mon Jan 02 15:04:05 -0700 2006", "Tue Jul 07 10:38:18 +0000 2015")

并且在打印的时候,使用这个格式字符串:

fmt.Println(t.Format("Monday Jan 2, 3:04pm"))

这将产生您预期的输出:

Tuesday Jul 7, 6:38am

Go Playground 上试试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2015-02-10
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多