在 golang 中有一个很重要的 格式化时间的字符串 2006-01-02T15:04:05Z07:00 , 这个也是 golang 默认时间模版模版中的 time.RFC3339
golang
2006-01-02T15:04:05Z07:00
time.RFC3339
RFC3339 = "2006-01-02T15:04:05Z07:00"
golang 中关于时间的处理, 用到了上面的 每一个 数字和字母。
需要特别注意的是, 时区用的是 7 而非 6 , 因为 6 已经在 年(2006) 中出现了
time.Time
// 1. 创建当前时间对象 now := time.Now() // 2. 通过各个字段创建时间对象 t1 := time.Date(2019, time.November, 17, 11, 0, 0, 0, time.UTC) // 3. 通过 time.Parse 解析字符串创建时间对象 FORMAT = `2006-01-02T15:04:05Z` timeStr := `2019-11-23T15:23:31Z` t, err := time.Parse(FORMAT, timeStr)
time.Parse()
在获取属性值的时候,可以直接通过 t.XXX() 方法获取, 且 XXX 方法名具有特别强的 语意 。
t.XXX()
XXX
now := time.Now() // 2021-08-25T now.Year() // 2021 年 now.Month() // August int(xxx) now.Day() // 25 now.YearDay() // 237 now.Date() // 2021 August 25 // ...
now.Month()
Month
type Month int
int
int(Month)
now.YearDay()
now.Date()
t.String()
t.String() 内置了一个 FORMAT 字符串,并使用了 t.Format() 进行格式化,
FORMAT
t.Format()
now.String() // 2021-08-25 22:15:47.467594 +0800 CST m=+0.000505982
t.Format(FOMART) 方法允许用户自定义传入自定义的 FOMART 格式, 以输出想要的格式
t.Format(FOMART)
FOMART
t.Format(time.RFC1123) // time.RFC1123 : Wed, 25 Aug 2021 22:15:47 CST t.Format(time.RFC822Z) // time.RFC822Z : 25 Aug 21 22:15 +0800 t.Format(time.RFC3339) // time.RFC3339 : 2021-08-25T22:15:47+08:00
t.MarshalXXX() ([]byte,error)
t.MarshalText() 与 t.MarshalJSON 默认使用的是 RFC3339 格式字符串。不同的是, MarshalJSON 在外层包裹了一对 双引号
t.MarshalText()
t.MarshalJSON
RFC3339
MarshalJSON
now := time.Now() b, _ := now.MarshalJSON() fmt.Printf("%s\n", b) // "2021-08-25T22:27:49.009467+08:00" b2, _ := now.MarshalText() fmt.Printf("%s\n", b2) // 2021-08-25T22:27:49.009467+08:00
golang 中非常友好的提供了 t.Before(), t.After(), t.Equal() 方法进行时间比较。
t.Before(), t.After(), t.Equal()
t1, _ := time.Parse("2006-01-02T15:04:05Z", "2021-09-20T10:12:30") t2, _ := time.Parse("2006-01-02T15:04:05Z", "2021-08-20T10:12:30") fmt.Println(t1.After(t2)) // false fmt.Println(t1.Equal(t1)) // true
t.Sub()
time.Duration
t.Add()
time.Duration 可以为 正数 和 负数 。
t.AddDate()
t1 := time.Now() // 2021-08-25 ... time.Sleep(time.Second * 1) t2 := time.Now() d1 := t1.Sub(t2) fmt.Println(d1.Seconds()) // -1.003566082