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())
}
}