# 关于 `package time`

个人体会:"wall clock" 可以理解为就是实际的时钟,而 "monotonic clock" 则是程序内部的时钟。
所以前者是用来获取具体的时间,后者是用来计时的。
ps: 原文都是用 "monotonic clock reading",含意很明显,就是读取时间。

## 总览

`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` 清楚地看到区别。

翻译下 golang package time的更多相关文章

  1. linux下golang的配置

    linux下golang的配置 之前开发golang一直在windows下,今天在linux下试了一下 ,遇到一些梗,比如go 找不到 sync包.花了一小时全部解决,把过程记录一下. 安装 go 我 ...

  2. linux下golang

    linux下golang的配置 linux下golang的配置 之前开发golang一直在windows下,今天在linux下试了一下 ,遇到一些梗,比如go 找不到 sync包.花了一小时全部解决, ...

  3. spring扫描classpath下特定package,并加载具有特定注解的接口

    spring扫描classpath下特定package,并加载具有特定注解的接口. 在框架平台的开发中,通常有很多的情况通过spring配置方式来实现某些功能会使得框架平台难以使用和扩展,我们通常的做 ...

  4. npm install 命令。默认会找到当前路径下的package.json。然后安装其中的依赖

    npm install 命令.默认会找到当前路径下的package.json.然后安装其中的依赖 By default, npm install will install all modules li ...

  5. Mac下golang开发环境配置

    go语言在开发效率和运行效率中的优势让很多人青睐,所以有倾向打算转向go语言的开发. 下面介绍在Mac OS X中golang的开发环境配置. 1.安装brew brew是一个mac下的由ruby开发 ...

  6. ubuntu下golang环境配置

    安装go 可以到Golang中国下载go的安装包 解压安装包tar -C /usr/local -xzf <安装包> 添加环境变量`export PATH=$PATH:/usr/local ...

  7. window下golang包管理glide使用说明

    golang是一门简洁高效的开发 语言,但是包管理一直是一个痛点,如图 : 很多开源项目特别是github.com中的大量应用golang.org和google.golang.org中的源码,且由于被 ...

  8. window下golang使用gRPC入门案例&net core客户端

    gRPC是google开源高性能分布式RPC框架,支持http/2 双向数据流传输及Protobuff,可以在任何环境下运行. 它可以有效地将数据中心内和跨数据中心的服务与可插拔支持进行负载均衡,跟踪 ...

  9. window下golang生成静态库给C语言调用

    buidmod为c-archive能在window下生成 ,c-shared则不行 1.golang生成c-archive静态库 main.go package main import "C ...

随机推荐

  1. [CC-ADJLEAF2]Adjacent Leaves

    [CC-ADJLEAF2]Adjacent Leaves 题目大意: 给定一棵有根树,考虑从根开始进行DFS,将所有叶子按照被遍历到的顺序排列得到一个序列. 定义一个叶子集合合法,当且仅当存在一种DF ...

  2. Jupyter Notebook 介绍 安装和使用技巧

    Jupyter Notebook介绍.安装及使用教程 原文链接:https://www.jianshu.com/p/91365f343585 目录一.什么是Jupyter Notebook? 1. 简 ...

  3. Build fails with an error: Execution failed for task ':react-native-google-analytics-bridge:compileDebugJavaWithJavac'.

    1,问题 Build fails with an error: Execution failed for task ':react-native-google-analytics-bridge:com ...

  4. python之面向对象的程序设计

    一.什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了程序的复杂度 缺点是: ...

  5. Ajax发送请求,并接受字符串

    前台: $.ajax({ type: 'POST', url: url, dataType: "json", success : function(data){ alert(&qu ...

  6. jQuery 学习02——效果:隐藏/显示、淡入淡出、滑动、动画、停止动画、Callback、链

    jQuery 效果- 隐藏hide()和显示show() 语法: $(selector).hide(speed,callback);$(selector).show(speed,callback); ...

  7. 利用exif.js解决手机上传竖拍照片旋转90\180\270度问题

    原文:https://blog.csdn.net/linlzk/article/details/48652635/ html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针 ...

  8. Unity游戏开发图片纹理压缩方案

    Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式. 在Texture2D的设置选项中,你可以针对不同的平台,设 ...

  9. jquery 多级联动下拉列表含(数据模型)

    方法 /** * 级联 * 联动 * @param url:访问json数据的地址 * @param param:参数 * @param levelIds:页面下拉标签数组,为联动级数 * @priv ...

  10. M600 Pro 安装问题解决

    1.遥控器版本为1.2.10 提示版本已是最新版本,那么Lightbridge2 必须是1.1.60 不能是1.1.70 2.卸载机翼的时候,尽量用飞机带的那把工具 3.机翼安装 135 逆时针 cc ...