你真的了解 time.Now() 吗?

💡 原文中文,约14000字,阅读约需34分钟。
📝

内容提要

本文分析了 Go 语言中的 time.Now() 函数及其实现,介绍了 time.Time 结构体如何同时包含日历时钟和单调钟,后者用于稳定计算时间差。通过源码分析,阐述了时间的存储、获取、溢出处理和时间比较。强调了 time.Now() 是唯一存储单调钟信息的时间构造方法,突显其在时间计算中的重要性。

🎯

关键要点

  • time.Time 结构体同时包含日历时钟和单调钟,用于稳定计算时间差。
  • time.Now() 是唯一存储单调钟信息的时间构造方法,确保时间计算的准确性。
  • time.Time 的 wall 字段分为三个部分,分别存储日历时钟和单调钟的信息。
  • 获取时间的实现依赖于系统,time.Now() 的实现与操作系统有关。
  • 在时间计算中,只有 time.Now() 存储了单调钟信息,其他构造方法如 Date、Unix 和 Parse 都使用 hasMonotonic=0。
  • 时间差的计算通过 Sub 方法实现,优先使用单调钟进行计算以避免时间倒流的问题。
  • Go 语言不考虑闰秒,时间计算中不会出现 '23:59:60' 的情况。

延伸问答

time.Now() 在 Go 语言中有什么特别之处?

time.Now() 是唯一存储单调钟信息的时间构造方法,确保时间计算的准确性。

time.Time 结构体是如何存储时间信息的?

time.Time 结构体同时包含日历时钟和单调钟,wall 字段分为三个部分,分别存储日历时钟和单调钟的信息。

如何计算两个时间点之间的时间差?

时间差的计算通过 Sub 方法实现,优先使用单调钟进行计算以避免时间倒流的问题。

Go 语言中的时间计算是否考虑闰秒?

Go 语言不考虑闰秒,时间计算中不会出现 '23:59:60' 的情况。

time.Now() 的实现与操作系统有什么关系?

获取时间的实现依赖于系统,time.Now() 的实现与操作系统有关。

time.Time 中的 wall 字段是如何工作的?

wall 字段的 64 位被分成了 1+33+30 三个部分,分别存储日历时钟和单调钟的信息。

➡️

继续阅读