时间概念呢
时间戳
- Unix时间戳(Unix timestamp)定义为从1970年01月01日00时00分00秒(UTC)起至现在经过的总秒数
- 不论东西南北、在地球的每一个角落都是相同
日期格式
- 字符串
python中转换关系
go中转换关系
获取时间相关函数
获取当前时间
- 代码
package mainimport ("log""strconv""time")func numLen(n int64) int {return len(strconv.Itoa(int(n)))}func main() {now := time.Now()log.Printf("[当前时间对象为:%v]", now)log.Printf("[当前时间戳 秒级:%v][位数:%v]", now.Unix(), numLen(now.Unix()))log.Printf("[当前时间戳 毫秒级:%v][位数:%v]", now.UnixNano()/1e6, numLen(now.UnixNano()/1e6))log.Printf("[当前时间戳 纳秒级:%v][位数:%v]", now.UnixNano(), numLen(now.UnixNano()))log.Printf("[当前时间戳 纳秒小数部分:%v]", now.Nanosecond())/*2021/07/17 16:34:10 [当前时间对象为:2021-07-17 16:34:10.2999431 +0800 CST m=+0.007295301]2021/07/17 16:34:10 [当前时间戳 秒级:1626510850][位数:10]2021/07/17 16:34:10 [当前时间戳 毫秒级:1626510850299][位数:13]2021/07/17 16:34:10 [当前时间戳 纳秒级:1626510850299943100][位数:19]2021/07/17 16:34:10 [当前时间戳 纳秒小数部分:299943100]*/}
结论
- 时间戳返回 int64
- 10位数时间戳 是秒单位
- 13位数时间戳 是毫秒单位
- 19位数时间戳 是纳秒单位
- 毫秒=纳秒/1e6
毫秒时间戳作用
- prometheus默认查询就是毫秒
具体日期相关函数
- 代码
package mainimport ("log""time")func main() {now := time.Now()//返回日期year, month, day := now.Date()log.Printf("[通过now.Data获取][年:%d 月:%d 日:%d]", year, month, day)log.Printf("[直接获取年 %d]", now.Year())log.Printf("[直接获取月 %d]", now.Month())log.Printf("[直接获取日 %d]", now.Day())// 分 时 秒hour, minute, second := now.Clock()log.Printf("[通过now.Clock获取][时:%d 分:%d 秒:%d]", hour, minute, second)log.Printf("[直接获取时 %d]", now.Hour())log.Printf("[直接获取分 %d]", now.Minute())log.Printf("[直接获取秒 %d]", now.Second())// 星期几log.Printf("[直接获取星期几 %d]", now.Weekday())// 时区zone, offset := now.Zone()log.Printf("[直接获取时区 %v ,和东utc时区差 几个小时:%d]", zone, offset/3600)log.Printf("[今天是 %d年 中的第 %d天]", now.Year(), now.YearDay())/*2021/07/17 16:44:57 [通过now.Data获取][年:2021 月:7 日:17]2021/07/17 16:44:57 [直接获取年 2021]2021/07/17 16:44:57 [直接获取月 7]2021/07/17 16:44:57 [直接获取日 17]2021/07/17 16:44:57 [通过now.Clock获取][时:16 分:44 秒:57]2021/07/17 16:44:57 [直接获取时 16]2021/07/17 16:44:57 [直接获取分 44]2021/07/17 16:44:57 [直接获取秒 57]2021/07/17 16:44:57 [直接获取星期几 6]2021/07/17 16:44:57 [直接获取时区 CST ,和东utc时区差 几个小时:8]2021/07/17 16:44:57 [今天是 2021年 中的第 198天]*/}
格式化时间
- Go 语言提供了时间类型格式化函数 Format(), 2006-01-02 15:04:05,也很好记忆(2006 1 2 3 4 5)
时间对象转字符串
package mainimport ("log""time")func main() {now := time.Now()log.Printf("[全部 :%v]",now.Format("2006-01-02 15:04:05"))log.Printf("[只有年 :%v]",now.Format("2006"))log.Printf("[/分割 :%v]",now.Format("2006/01/02 15:04"))}
时间戳与日期字符串相互转化
- 要先转成将时间戳转成 time.Time 类型再格式化成日期格式。
package mainimport ("log""time")func main() {// 时间戳ts := time.Now().Unix()layout := "2006-01-02 15:04:05"// 构造时间对象t := time.Unix(ts, 0)log.Printf(t.Format(layout))}
日期字符串转时间戳
- 解析时常用 time.ParseInLocation(),可以指定时区
package mainimport ("log""time")func main() {tStr := "2021-07-17 16:52:59"layout := "2006-01-02 15:04:05"t1, _ := time.ParseInLocation(layout, tStr, time.Local)t2, _ := time.ParseInLocation(layout, tStr, time.UTC)log.Printf("[ %s的 CST时区的时间戳为 :%d]", tStr, t1.Unix())log.Printf("[ %s的 UTC时区的时间戳为 :%d]", tStr, t2.Unix())log.Printf("[UTC - CST =%d 小时]", (t2.Unix()-t1.Unix())/3600)}
时间差
package mainimport ("log""time")var layout = "2006-01-02 15:04:05"func tTostr(t time.Time) string {return time.Unix(t.Unix(), 0).Format(layout)}func main() {now := time.Now()log.Printf("[当前时间为:%v]", tTostr(now))// 1小时1分1秒后t1, _ := time.ParseDuration("1h1m1s")m1 := now.Add(t1)log.Printf("[ 1小时1分1秒后时间为:%v]", tTostr(m1))// 1小时1分1秒前t2, _ := time.ParseDuration("-1h1m1s")m2 := now.Add(t2)log.Printf("[ 1小时1分1秒 前时间为:%v]", tTostr(m2))// sub计算两个时间差sub1 := now.Sub(m2)log.Printf("[ 时间差 :%s 相差小时数:%v 相差分钟数:%v ]", sub1.String(), sub1.Hours(), sub1.Minutes())t3, _ := time.ParseDuration("-3h3m3s")m3 := now.Add(t3)log.Printf("[time.since 当前时间与t的时间差 :%v]", time.Since(m3))log.Printf("[time.until t 当前时间的时间差 :%v]", time.Until(m3))m4 := now.AddDate(0, 0, 5)log.Printf("[5天后 的时间 :%v]", m4)}
日期比较
package mainimport ("log""time")var layout = "2006-01-02 15:04:05"func tTostr(t time.Time) string {return time.Unix(t.Unix(), 0).Format(layout)}func main() {now := time.Now()t1, _ := time.ParseDuration("1h")m1 := now.Add(t1)log.Printf("[a.after(b) a在b之后 :%v]", m1.After(now))log.Printf("[a.Before(b) a在b之前 :%v]", now.Before(m1))log.Printf("[a.Equal(b) a=b :%v]", m1.Equal(now))}


