# 关于 `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. node 将本地项目docker化

    vi test.sh docker rm -f kao3 || echo kao3 not exists;docker run -itd \--privileged=true \-v ~/logs:/ ...

  2. jquery中遍历

    1.jQuery--Dom遍历 1)jquery遍历---祖先元素 parents() 方法返回被选元素的所有祖先元素,它一路向上直到文档的根元素 (<html>).也可以使用可选参数来过 ...

  3. Linux之为集群内的机器设定主机名

    作业二:为集群内的机器设定主机名,利用/etc/hosts文件来解析自己的集群中所有的主机名,相应的,集群的配置应该改成使用主机名的方式 1.主机信息配置并解析 [root@localhost ~]# ...

  4. ES6_入门(3)_顶层对象属性

    //顶层对象属性:在ES5中,顶层对象的属性与全局变量是等价的.以下代码中,为顶层对象的属性赋值与全局变量的赋值,是同一件事. window.a=10; console.log(window.a); ...

  5. MySql 数据库安装、环境变量配置 以及 本地连接

    一.准备 MySql 的安装包,这里我从网上下载的是 mysql-installer-community-5.6.21.1.msi,如下图:     二.,双击 mysql-installer-com ...

  6. jQuery 学习05——AJAX:定义、load()方法、get()/post()方法

    AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). load() 方法:从服务器加载数据,并把返回的数据放入被选元素中. 语法:$ ...

  7. [Asp.net core]使用ssh命令发布asp.net core项目

    命令 # 移除之前发布的包 rm -rf ./.Publish rm -rf ./Wolfy.Blog.tar.gz # 编译并发布 将发布包打包在.Publish目录下 -o "../.P ...

  8. YUV420、YUV422、RGB24转换

      //平面YUV422转平面RGB24static void YUV422p_to_RGB24(unsigned char *yuv422[3], unsigned char *rgb24, int ...

  9. MYSQL千万级数据量的优化方法积累

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  10. SharePoint JavaScript 更新用户和组字段

    前言 最近,需要更新列表字段,字段的类型是用户和组,so写了这么一段代码 function updateUserField(){ var ctx = new SP.ClientContext.get_ ...