【转】理解Golang的Time结构
原文:https://www.jianshu.com/p/480ac51a22c0
--------------------
理解Golang的Time结构
在golang中创建并打印一个时间对象,会看到如下输出
2018-10-26 14:15:50.306558969 +0800 CST m=+0.000401093
2018-10-26 14:15:51.310559881 +0800 CST m=+1.004425285
2018-10-26 14:15:52.311822486 +0800 CST m=+2.005711106
2018-10-26 14:15:53.314599457 +0800 CST m=+3.008511329
2018-10-26 14:15:54.31882248 +0800 CST m=+4.012757636
2018-10-26 14:15:55.320059921 +0800 CST m=+5.014018292
2018-10-26 14:15:56.323814998 +0800 CST m=+6.017796644
2018-10-26 14:15:57.324858749 +0800 CST m=+7.018863606
2018-10-26 14:15:58.325164174 +0800 CST m=+8.019192224
2018-10-26 14:15:59.329058535 +0800 CST m=+9.023109863
2018-10-26 14:16:00.329591268 +0800 CST m=+10.023665796
可以看到m=+后面所显示的数字,就是文档中所说的Monotonic Clocks。
Time结构
那么Monotonic Clock和Wall Clock在Time中是怎么存储的呢?来看一下Time结构体。
t, _ := time.Parse(time.RFC3339, "1890-01-02T15:04:05Z")
fmt.Println(t) // 1890-01-02 15:04:05 +0000 UTC
实践中需要注意的问题
既然Time结构所表示的时间,有可能有Monotonic Clock也可能没有,那么在使用中就有可能遇到一些问题,例如下面这种情况。
timeA := time.Now()
timeB := time.Unix(0, timeA.UnixNano())
fmt.Println(timeA) // 2018-10-26 16:37:02.216165074 +0800 CST m=+0.000363156
fmt.Println(timeB) // 2018-10-26 16:37:02.216165074 +0800 CST
r := timeA.Equal(timeB)
fmt.Println(r) // true
上面两个时间的Wall Clock部分相同,一个有Monotonic Clock一个没有,但是比较的结果是两个时间是相同的。
timeA := time.Now()
timeB := timeA.Round(0)
fmt.Println(timeA) // 2018-10-26 16:43:03.799263739 +0800 CST m=+0.000357758
fmt.Println(timeB) // 2018-10-26 16:43:03.799263739 +0800 CST
参考文章
https://golang.org/pkg/time/