美文网首页
GO time和字符串互转

GO time和字符串互转

作者: 舍是境界 | 来源:发表于2022-01-20 07:14 被阅读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())
        }
    }
    

    相关文章

      网友评论

          本文标题:GO time和字符串互转

          本文链接:https://www.haomeiwen.com/subject/jagicrtx.html