代码之家  ›  专栏  ›  技术社区  ›  23k

分析UTC日期字符串并转换为其他格式

  •  -2
  • 23k  · 技术社区  · 7 年前

    到这儿来吧。

    我有一个日期串 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 回复  |  直到 7 年前
        1
  •  2
  •   quasoft    7 年前

    你有两个问题。

    首先,不应该命名变量 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


    此外,数据库使用的时间格式通常被描述为rfc339,它也可以作为 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)
    
        2
  •  2
  •   Himanshu    7 年前

    正如@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