GO time和字符串互转

2022-01-20  本文已影响0人  舍是境界

工作中经常会遇到时间转字符串,或者根据字符串转日期的需求,这里做相关介绍说明。

先来看下GO time包下给我们提供的常用layout有哪些:

    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" // RFC822 with numeric zone
    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" // RFC1123 with numeric zone
    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"

注意这里的时间,其实可以记为:01/02 03:04:05PM '06 -0700,也就是一月二号下午3点4分5秒,06年,时区是-7

本质其实还是占位符,和%Y代表年,道理是一样的,不过在go里面我们必须采用此时间的占位符,下面我们看看具体的转换代码:

int64转日期

time.Unix(1641912386, 0),

注意这里的第一个参数为格林威治到现在的秒数,后面则为ms数

字符串转日期

func ParseTime(layout string, timeStr string) (time.Time, error){
    var cstZone = time.FixedZone("CST", 8*3600)
    return time.ParseInLocation(layout, timeStr, cstZone)
}

//相当于time.ParseInLocation(layout, timeStr, time.UTC)
func ParseTimeV2(layout string, timeStr string) (time.Time, error){
    return time.Parse(layout, timeStr)
}

日期转字符串

func FormatTime(layout string, t time.Time) string {
    return t.Format(layout)
}

使用示例:

func TestFormatTime(t *testing.T) {
    tests := []struct{
        name string
        layout string
        input time.Time
        expect string
    }{
        {
            name: "Tue Jan 11 2022 22:46:26 GMT+0800 (中国标准时间)",
            layout: "Mon, 02 Jan 2006 15:04:05 GMT+0800",
            input: time.Unix(1641912386, 0),
            expect: "Tue, 11 Jan 2022 22:46:26 GMT+0800",
        },
        {
            name: "Tue Jan 11 2022 22:46:26 GMT+0800 (中国标准时间)",
            layout: "Mon, 02 Jan 2006 15:04:05",
            input: time.Unix(1641912386, 0),
            expect: "Tue, 11 Jan 2022 22:46:26",
        },
        {
            name: "Tue Jan 11 2022 22:46:26 GMT+0800 (中国标准时间)",
            layout: "2006-01-02T15:04:05",
            input: time.Unix(1641912386, 0),
            expect: "2022-01-11T22:46:26",
        },
    }

    for _, tt := range tests {
        result := FormatTime(tt.layout, tt.input)
        assert.Equal(t, tt.expect, result)
    }
}

func TestParseTime(t *testing.T) {
    tests := []struct{
        name string
        layout string
        input string
        expect int64
    }{
        {
            name: "Tue Jan 11 2022 22:46:26 GMT+0800 (中国标准时间)",
            layout: "Mon, 02 Jan 2006 15:04:05 GMT+0800",
            input: "Tue, 11 Jan 2022 22:46:26 GMT+0800",
            expect: int64(1641912386),
        },
        {
            name: "Tue Jan 11 2022 22:46:26 GMT+0800 (中国标准时间)",
            layout: "Mon, 02 Jan 2006 15:04:05",
            input: "Tue, 11 Jan 2022 22:46:26",
            expect: int64(1641912386),
        },
        {
            name: "Tue Jan 11 2022 22:46:26 GMT+0800 (中国标准时间)",
            layout: "2006-01-02T15:04:05",
            input: "2022-01-11T22:46:26",
            expect: int64(1641912386),
        },
    }

    for _, tt := range tests {
        result, err := ParseTime(tt.layout, tt.input)
        if err != nil {
            t.Error(err)
        }
        assert.Equal(t, tt.expect, result.Unix())
    }
}
上一篇下一篇

猜你喜欢

热点阅读