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

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

💡 原文中文,约9600字,阅读约需23分钟。
📝

内容提要

本文介绍了Golang中时间处理模块time的源码实现,包括time.Time结构体的日历时钟和单调时钟,以及常用的构造时间的方式和时间差的计算方法。

🎯

关键要点

  • Golang中的时间处理模块time的源码实现包括time.Time结构体的日历时钟和单调时钟。
  • 日历时钟用于显示时间,而单调钟用于稳定计算时间差。
  • time.Time结构体的wall字段分为三个部分,分别存储不同的时间信息。
  • 获取当前时间的Now方法返回Unix时间戳、纳秒偏移量和系统级单调钟的值。
  • Unix、UnixMilli和UnixMicro方法用于生成不同精度的时间。
  • Date方法处理日期的溢出、闰年和时区,并生成hasMonotonic=0的时间。
  • Parse方法用于解析时间字符串并生成时间对象。
  • Now方法是唯一存储单调钟信息的构造时间方式,其他方法均为hasMonotonic=0。
  • 时间的减法通过Sub方法实现,优先使用单调钟进行计算。
  • IsZero方法用于检测时间是否为零值,Equal方法用于比较两个时间是否相等。
  • time.Now的实现依赖于runtime,Linux Amd64下优先使用vDSO获取时间。
  • Round方法用于四舍五入时间,并会删除单调钟信息。
  • Go不考虑闰秒,因此不会出现23:59:60的时间。
➡️

继续阅读