解析UTC日期字符串并转换为不同的格式

时间:2018-06-07 18:04:42

标签: date go

在这里新人。

我有一个日期字符串2018-06-07T16:16:57Z,我想将其转换为类似mm/dd/yyyy hh:mm的内容。

这似乎是一个经常被问到的问题,但我似乎找不到任何适合我的问题。

我在时间字段中阅读并试图像这样转换

time := row["Date & Time"]
fmt.Println(time)
t, _ := time.Parse("2006-01-02 15:04:05 -0700 UTC", time)
fmt.Println(t)

但我认为问题是我没有正确的格式字符串。我尝试了一些资源但没有成功。

当我按原样打印t时,我得到0001-01-01 00:00:00 +0000 UTC,这显然是不正确的。

我想做的是将我正在阅读的时间转换为

newTime := currentDate.Format("01/02/2006 hh:mm")

2 个答案:

答案 0 :(得分:2)

正如@mkopriva所描述的那样,布局应该匹配。了解2006-01-02T15:04:05Z的布局,通过Golang spec layout用于将字符串转换为日期

  

Parse解析格式化的字符串并返回它的时间值   代表。布局通过显示引用如何定义格式   时间,定义为

Mon Jan 2 15:04:05 -0700 MST 2006

然后根据您的要求将返回时间值用于Format日期。

package main

import (
    "fmt"
    "time"
)

func main() {
    layout1 := "2006-01-02T15:04:05Z"
    t, err := time.Parse(layout1, "2018-06-07T16:16:57Z")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(t.Format("01/02/2006 15:04"))
}

Go Playground

上查看

答案 1 :(得分:2)

你有两个问题。

首先,您不应将变量命名为time,因为这是内置包的名称。我想你知道这一点,这只是一个复制粘贴错误。

接下来,传递给time.Parse()的字符串是一个格式字符串,应该描述数据库中时间字符串的格式。您已经知道格式是什么:2018-06-07T16:16:57Z,所以只需使用Go's reference time替换值。

这是工作变体:

package main

import (
    "fmt"
    "time"
)

func main() {
    tm := "2018-06-07T16:16:57Z"
    fmt.Println(tm)
    t, err := time.Parse("2006-01-02T15:04:05Z", tm)
    if err != nil {
        panic(err)
    }
    fmt.Println(t)
}

Run in playground

数据库使用的时间格式通常被描述为RFC3339,它也可以作为Go中的time.RFC3339常量。

因此,使用它可以进一步简化您的代码:

package main

import (
    "fmt"
    "time"
)

func main() {
    tm := "2018-06-07T16:16:57Z"
    fmt.Println(tm)
    t, err := time.Parse(time.RFC3339, tm)
    if err != nil {
        panic(err)
    }
    fmt.Println(t)
}

Run in playground

如果您愿意,也可以让数据库驱动程序通过将其扫描到time.Time变量来为您转换时间。

例如:

var tm time.Time
if err = row.Scan(&tm); err != nil {
    panic(err)
}
fmt.Print(tm)