开放的编程资料库

当前位置:我爱分享网 > Go教程 > 正文

在Golang中解析日期时间值

在本文中,我们展示了如何使用time.Parsetime.ParseInLocation在Golang中解析日期时间值。

func Parse(layout, value string) (Time, error)

parse函数解析格式化的字符串并返回它表示的时间值。

func ParseInLocation(layout, value string, loc *Location) (Time, error)

ParseInLocation函数解析格式化字符串并返回它表示的时间值,同时考虑位置(时区)。

与大多数其他语言不同,Go不使用格式说明符(例如yyyy-mm-dd)解析日期时间值的常用方法。相反,它使用MonJan215:04:05MST2006的唯一日期时间值。因此,为了解析日期时间值,我们选择了这一时刻的特定布局。

const (

    Layout      = "01/02 03:04:05PM '06 -0700"
    ANSIC       = "Mon Jan _2 15:04:05 2006"
    UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
    RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
    RFC822      = "02 Jan 06 15:04 MST"
    RFC822Z     = "02 Jan 06 15:04 -0700"
    RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
    RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
    RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700"
    RFC3339     = "2006-01-02T15:04:05Z07:00"
    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
    Kitchen     = "3:04PM"

    // Handy time stamps.
    Stamp      = "Jan _2 15:04:05"
    StampMilli = "Jan _2 15:04:05.000"
    StampMicro = "Jan _2 15:04:05.000000"
    StampNano  = "Jan _2 15:04:05.000000000"
)

time模块中有几个预定义的布局可用。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

Gotime.Parse示例

在第一个示例中,我们使用time.Parse函数来解析一些日期时间值。

package main

import (
    "fmt"
    "time"
)

// Mon Jan 2 15:04:05 MST 2006

func main() {

    v1 := "2022/05/12"
    v2 := "14:55:23"
    v3 := "2014-11-12T11:45:26.37"

    const (
        layout1 = "2006/01/02"
        layout2 = "15:04:05"
        layout3 = "2006-01-02T15:04:05"
    )

    t, err := time.Parse(layout1, v1)

    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(t.Format(time.UnixDate))

    t, err = time.Parse(layout2, v2)

    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(t.Format(time.Kitchen))

    t, err = time.Parse(layout3, v3)

    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(t.Format(time.UnixDate))
}

我们解析三个日期时间值。

v1 := "2022/05/12"
v2 := "14:55:23"
v3 := "2014-11-12T11:45:26.37"

我们有三个以不同格式编写的日期时间字符串。

const (
    layout1 = "2006/01/02"
    layout2 = "15:04:05"
    layout3 = "2006-01-02T15:04:05"
)

为了读取日期字符串,我们需要准备适当的布局。

t, err := time.Parse(layout1, v1)

if err != nil {
    fmt.Println(err)
}

fmt.Println(t.Format(time.UnixDate))

我们使用time.Parse读取第一个值并检查错误值。然后我们打印值并使用Format函数将其格式化为time.UnixDate

$ go run main.go
Thu May 12 00:00:00 UTC 2022
2:55PM
Wed Nov 12 11:45:26 UTC 2014

预定义的日期时间布局

time模块中有几个预定义的日期时间布局。

package main

import (
    "fmt"
    "time"
)

func main() {

    dates := []string{
        "Sat May 28 11:54:40 CEST 2022",
        "Sat May 28 11:54:40 2022",
        "Sat, 28 May 2022 11:54:40 CEST",
        "28 May 22 11:54 CEST",
        "2022-05-28T11:54:40.809289619+02:00",
        "Sat May 28 11:54:40 +0200 2022",
    }

    layouts := []string{
        time.UnixDate,
        time.ANSIC,
        time.RFC1123,
        time.RFC822,
        time.RFC3339Nano,
        time.RubyDate,
    }

    for i := 0; i < len(dates); i++ {

        parsed, err := time.Parse(layouts[i], dates[i])

        if err != nil {
            fmt.Println(err)
        }

        fmt.Println(parsed)
    }
}

在示例中,我们有一个包含六个日期时间字符串的片段。我们使用适当的预定义日期时间常量来解析它们。

$ go run main.go
2022-05-28 11:54:40 +0200 CEST
2022-05-28 11:54:40 +0000 UTC
2022-05-28 11:54:40 +0200 CEST
2022-05-28 11:54:00 +0200 CEST
2022-05-28 11:54:40.809289619 +0200 CEST
2022-05-28 11:54:40 +0200 CEST

Gotime.ParseInLocation示例

time.ParseInLocation函数在解析日期时间值时也会考虑时区。

package main

import (
    "fmt"
    "log"
    "time"
)

func main() {

    loc, err := time.LoadLocation("Local")

    if err != nil {
        log.Println(err)
    }

    date := "Sat May 28 11:54:40 2022"

    parsed, err := time.ParseInLocation(time.ANSIC, date, loc)

    if err != nil {
        log.Println(err)
    }

    fmt.Println(parsed)

    loc, err = time.LoadLocation("Europe/Moscow")

    if err != nil {
        log.Println(err)
    }

    parsed, err = time.ParseInLocation(time.ANSIC, date, loc)

    if err != nil {
        log.Println(err)
    }

    fmt.Println(parsed)
}

该示例解析本地和欧洲/莫斯科位置的给定日期。

$ go run main.go
2022-05-28 11:54:40 +0200 CEST
2022-05-28 11:54:40 +0300 MSK

在本教程中,我们展示了如何解析日期时间值。

列出所有Go教程。

未经允许不得转载:我爱分享网 » 在Golang中解析日期时间值

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏