# 关于 `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. JAVA笔记--static

    1.static 修饰变量 public class MyClass { static int i = 4; } 其中static 修饰变量,表示变量 i 属于 MyClass 类,所有的对象共享一个 ...

  2. 前端可视化数据--echarts

    很幸运能够给大家分享我对echarts的见解,在一些大型互联网公司面试时都会问到会使用echarts么?  今天在做项目时有这个需求,有幸学习echarts. 二.echarts.js的优势与不足 优 ...

  3. PAT Basic 1046

    1046 划拳 (15 分) 划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输 ...

  4. weblogic 内存配置

    修改weblogic 使用内存 修改位置:startWeblogic.sh 在最开头增加使用内存配置信息如下: 我的服务器配置 内存:32G   ,CPU:16  根据实际情况配置 #!/bin/sh ...

  5. JSP(1)—基础知识

    JSP(1)-基本知识 起源 在很多动态网页中绝大多数网页都是固定不变的只有局部内容需要动态产生和改变,如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的的静态内容,也需要程序 ...

  6. Servlet(4)—一个简单的Servlet实例

    简单实例 页面请求登陆,提交表单数据 <body> <form action="loginServlet" method="get"> ...

  7. log4j2发送消息至Kafka

    title: 自定义log4j2发送日志到Kafka tags: log4j2,kafka 为了给公司的大数据平台提供各项目组的日志,而又使各项目组在改动上无感知.做了一番调研后才发现log4j2默认 ...

  8. Asp.Net Core获取请求上下文HttpContext

    注:特别说明当前版本对应.Net Core2.1意义上框架 一.注入HttpContextAccessor ASP.NET Core中提供了一个IHttpContextAccessor接口,HttpC ...

  9. 【前端酷站】分享一个纯 Javascript 的图表库与立体像素风制作~

    今天小编为大家推荐一个神奇的酷站.ECharts,一个纯 Javascript 的图表库. 以下是各个几个不错的界面的介绍: 首页:http://echarts.baidu.com/ 在首页有完整的说 ...

  10. webpack 配置缓存

    1.输出文件的文件名 加hash 2.提取引导模板 3.模块标识符 https://webpack.docschina.org/guides/caching/#src/components/Sideb ...