当前位置: 首页 > 科技观察

Go1.20中关于Time的更新有两次,终于不用背2006-01-0215-04-05了!

时间:2023-03-12 13:54:24 科技观察

大家好,我是炸鱼。Go语言中比较有特色的一个地方就是时间标准库,它经常被用在各种与时间相关的场景中,比如:定时/延迟任务、数据更新、时间比较等。官方Demo是一个计算时间差的例子:Sub(start)println(elapsed)}Outputresult:1000000000Mysterious2006-01-0215:04:05根据社区反馈,下面的例子更糟糕:funcmain(){now:=time.Now()v:=now.Format("2006-01-0215:04:05")println(v)}输出结果:2009-11-1023:00:00这时候你会遇到几个问题...最常被问到的问题是2006-01-0215:04:05。这是随便写的时间点吗?甚至有传言说这是Go语言的诞生时间……为什么这个时间点居然是2006年?-01-0215:04:05是一种参考时间格式,即其他语言中的Y-m-dH:i:s格式,功能上用于时间格式化和规范。那么为什么是2006-01-0215:04:05?其实,这些“数字”是有意义的。每个布局字符串都是时间戳的表示,而不是随机时间点。看官方例子中的如下方法:Jan215:04:052006MST123456-7我们也可以记成2006年1月2日的3:04:5,真的很难记。Go虽然给出了一系列感觉合理的解释,但也试图通过理解而不是死记硬背的方式教大家记下这个时间点的格式规范。现实是残酷的,母语不同,业务类型不同,时间标准库不经常使用,很容易忘记具体值。老大还分析了Gomodules上的所有模块代码,发现这个日期时间点使用频率很高:排名频率格式为175616time.RFC3339223954time.RFC3339Nano313312"2006-01-0215:04:05"412332"2006-01-02"511940time.RFC1123总结以上数据,终于在Go13年后,在Go1.20中加入如下三个常量:DateTime="2006-01-0215:04:05"DateOnly="2006-01-02"TimeOnly="15:04:05"在新版本中可以直接引用。以后问这个是什么意思的同学可能会少一些。支持比较:Time.Compare目前在标准库中。比较time.Time对象的方法有3种,分别是:Before()、Equal()和After(),它们在功能上类似于<、==和>。但是缺少<=和>=的等效项,因此在您的程序中实现起来会很麻烦。经常讨论Go1.20会支持Time.Compare来达到类似的效果。效果是比较Time对象t和u。该函数返回以下结果:-1如果t在u之前。如果t在u之后,返回+1。如果它们相同则返回0。源码如下:func(tTime)Compare(uTime)int{vartc,ucint64ift.wall&u.wall&hasMonotonic!=0{tc,uc=t.ext,u.ext}else{tc,uc=t.sec(),u.sec()如果tc==uc{tc,uc=int64(t.nsec()),int64(u.nsec())}}switch{casetcuc:return+1}return0}函数内部比较简单。总结GoTime一直是话题榜上的老面孔。这次在Go1.20的新特性中,对常用的时间点2006-01-0215:04:05进行了常量声明,方便我们后面不用“死记硬背”的查阅。在Time对象的比较中,也完成了Compare方法,方便比较前后两个时间对象。Go1.20将于明年2023年2月或3月左右上市。预览版将于11月底发布。赶不赶?