翻譯下 golang package time

# 關於 `package time`

我的體會:"wall clock" 能夠理解爲就是實際的時鐘,而 "monotonic clock" 則是程序內部的時鐘。
因此前者是用來獲取具體的時間,後者是用來計時的。
ps: 原文都是用 "monotonic clock reading",含意很明顯,就是讀取時間。golang

## 總覽

`package time` 提供了用於測量和顯示時間的功能。
日曆的計算,老是假定Gregorian日曆 - 無閏秒。測試

## Monotonic Clocks

操做系統同時提供了 "wall clock" 和 "monotonic clock",前者用於時鐘的同步,後者不是。
通用的作法是,"wall clock" 用於獲取時間,而 "monotonic clock" 則用於測量時間。
`time.Now()` 同時包含了 "wall clock" 和 "monotonic clock",想要讀取時間,就使用前者,想要測量時間、特殊的對比和相減,就使用後者。

例如,下面的代碼是計算代碼的執行耗時,大約老是20ms,不管 "wall clock"怎麼改變:
```golang
package time

start := time.Now()
//... operation that takes 20 milliseconds ...
t := time.Now()
elapsed := t.Sub(start)
```

在其餘狀況裏,例如 `time.Since(start)`、`time.Until(deadline)`以及`time.Now().Before(deadline)`,都是相似的,都與 "wall clock" 的改變無關。

本節的剩餘部分給出瞭如何使用"monotonic clock"的細節,可是,使用本package無需理解這些細節。

`time.Now()` 返回的 `Time`,包含了一個 `monotonic clock`。 而,若是 `Time t` 包含一個 "monotonic clock",那 `t.Add` 就能夠同時給 "wall clock"和"monotonic clock"增長 duration - 以便計算結果。 由於 `t.AddDate(y, m, d)`、`t.Round(d)`和`t.Truncate(d)` 都是 "wall time"的計算,它們會從結果中去掉全部的 "monotonic clock"。由於 `t.In`、`t.Local`和`t.UTC` 都是使用它們的 "wall time" 結果,因此它們也會從結果中去掉全部的 "monotonic clock"。
去掉 "monotonic clock" 的權威作法是 `t = t.Round(0)`。

若是 `Time t`和 `Time u` 都包含 "monotonic clock",那麼操做 `t.After(u)`、`t.Before(u)`、`t.Equal(u)`以及`t.Sub(u)` 僅僅會使用 "monotonic clock",而忽略掉 "wall clock"。若是 `t`或`u` 有一個不包含 "monotonic clock",這些操做纔會使用 "wall clock"。

在一些系統中,當計算機休眠的時候,"monotonic clock"會中止。在這種系統上,`t.Sub(u)`可能不會精確地反映`t`和`u`之間的時間。

由於 "monotonic clock" 的意義僅限於當前進程,因此由`t.GobEncode`、`t.MarshalBinary`、`t.MarshalJSON`和`t.MarshalText`序列化獲得的內容會忽略掉 "monotonic clock",且 `t.Format` 也沒有提供相應的格式化。
相似地,使用 `time.Date`、`time.Parse`、`time.ParseInLocation`、`time.Unix`來構造,以及經過反序列化 `t.GobDecode`、`t.UnmarshalBinary`、`t.UnmarshalJSON`、`t.UnmarshalText`獲得的時間,也不會包含 "monotonic clock" 。

注意,Go的 `==` 操做符,不只會比較時間的`instant`,還會比較`Location`以及 "monotonic clock"。詳見 Time類型的文檔,那裏有一個相等性測試的討論。

爲了調試方便,`t.String`包含了 "monotonic clock" - 若是存在的話。 若是 `t !=u ` 是由於不一樣的 "monotonic clock" 的話,能夠經過 `t.String` 和 `u.String` 清楚地看到區別。

操作系統

相關文章
相關標籤/搜索