go time分析 陷阱

本文探讨了Go语言中时间测量的问题,指出time.Now()与字符串解析时间进行比较时可能出现的不一致,原因是它们分别使用了单调时钟和墙上时钟。文章介绍了单调时钟和墙上时钟的概念,并分析了Time结构体的组成。通过分析`now()`和`nanotime()`函数,揭示了Go获取时间的细节,指出`now()`的开销大约是`nanotime()`的两倍。此外,文章还讨论了时间运算,特别是在处理时间差值时的优化策略。
摘要由CSDN通过智能技术生成

1 问题

time.now() 和字符串解析出来的时间 采用before 的方法  出来的结果和实际的情况不一致

愿意是time,now 是monotonic time  字符串解析的是wall time 所以比较的结果有可能是不对的

2 解决方法

方法1 
把时间都采用time.Parse 处理后比较
如 
format := "2006-01-02 15:04:05"
now := time.Now()
//now, _ := time.Parse(format, time.Now().Format(format))
a, _ := time.Parse(format, "2015-03-10 11:00:00")
b, _ := time.Parse(format, "2015-03-10 16:00:00")

3 时间的测量

在os中,有两个时钟:墙上时钟和单调时钟. 1. 墙上时钟. (wall time, real time) 2. 单调时钟. (monotonic time)

由于石英钟本身的误差,时间会有闰秒等原因,单调时钟与墙上时钟不一致。 两个时钟的具体含义参见《深入理解linux内核

linux如何获取时间呢,很简单的一个思路是, 系统启动时通过daytime服务获得一个时间t0,并记录此时的单调时钟d0。 下次获得时间时,只需要获得单调时钟d,然后d-d0+t0即可获取墙上时钟。

Time结构体分析

type Time struct {
    // 省略注释
    wall uint64
    ext  int64

    loc *Location
}

顾名思义,loc代表时区信息,wall跟墙上时钟有关,剩下的ext跟模式有关。 通过阅读注释,这里的time 有两种模式,是否包含单调时钟。 (什么时候会不含单调时钟呢?外部输入的时间。因为单调时钟是本机硬件的节拍数,不同机器没有可比性) 如果包含单调时钟,那么wall中会包含一个时间戳秒(代表墙上时钟),和一个时间戳纳秒(代表墙上时钟),ext字段储存单调时钟。 如果不包含单调时钟,那么wall包含一个

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值