首页 > 其他分享 >Go1.20 中两个关于 Time 的更新,终于不用背 2006-01-02 15:04:05 了!

Go1.20 中两个关于 Time 的更新,终于不用背 2006-01-02 15:04:05 了!

时间:2022-11-17 18:14:44浏览次数:52  
标签:02 01 15 04 05 2006

大家好,我是煎鱼。

Go 语言中有一个东西是比较有特色的,那就是 time 标准库,在各类与时间有关的场景都会常常用到,例如:定时/延迟任务、数据更新、时间比较。

官方 Demo 是一个计算时间差的样例:

import "time"

func main() {
 start := time.Now()
 time.Sleep(time.Second)
 t := time.Now()
 elapsed := t.Sub(start)
 println(elapsed)
}

输出结果:

1000000000

神秘的 2006-01-02 15:04:05

在社区反馈中,更虎的是以下这个样例:

func main() {
 now := time.Now()
 v := now.Format("2006-01-02 15:04:05")
 println(v)
}

输出结果:

2009-11-10 23:00:00

这时候大家会遇到几个问题...最被常问的是 2006-01-02 15:04:05,这是随便写的时间点吗,甚至还曾经有传言说这是 Go 语言的诞生时间...

为什么是这个时间点

实际上 2006-01-02 15:04:05 是一个参考时间的格式,也就是其它语言中 Y-m-d H:i:s 格式,在功能上用于时间的格式化处理和规范。

那为什么是 2006-01-02 15:04:05 呢?其实这些 ”数字“ 是有意义的,每个布局字符串都是一个时间戳的表示,并非随便写的时间点。

可参见官方例子中的如下方式:

Jan 2 15:04:05 2006 MST
1   2  3  4  5    6  -7

我们也可以将其记忆为 2006 年 1 月 2 日 3 点 4 分 5 秒。

确实背不下来,快优化

虽然 Go 官方给出了一系列感觉很合理的解释,也通过上面的方式试图教会大家靠理解而不是靠纯背把这个时间点格式规范给记下来...

现实是很残酷的,母语不同,业务类型不同,不会经常用到 time 标准库,很容易忘记具体数值。

大佬也分析了 Go modules 上的所有模块代码,发现这个日期时间点,使用的次数非常高频:

排名频率格式
1 75616 time.RFC3339
2 23954 time.RFC3339Nano
3 13312 "2006-01-02 15:04:05"
4 12332 "2006-01-02"
5 11940 time.RFC1123

综上数据所述,终于在 Go 过去了 13 年后,将会在 Go1.20 增加如下三个常量:

DateTime   = "2006-01-02 15:04:05"
DateOnly   = "2006-01-02"
TimeOnly   = "15:04:05"

新版本中直接引用即可。

以后问这是什么意思的同学,可能会变少。

支持比较:Time.Compare

目前在标准库中,有 3 个方法来比较 time.Time 对象,分别是:Before()、Equal() 和 After(),作用上类似 <、== 和 >。但缺少 <= 和 >= 的等价物,因此在程序中实施起来会比较麻烦。

经常一番讨论,将会在 Go1.20 支持 Time.Compare,以此来达到类似的效果。作用是将 Time 对象 t 和 u 两者进行比较。

函数返回如下几种结果:

  • 如果 t 在 u 之前,则返回 -1。
  • 如果 t 在 u 之后,则返回 +1。
  • 如果它们相同,则返回 0。

源代码如下:

func (t Time) Compare(u Time) int {
 var tc, uc int64
 if t.wall&u.wall&hasMonotonic != 0 {
  tc, uc = t.ext, u.ext
 } else {
  tc, uc = t.sec(), u.sec()
  if tc == uc {
   tc, uc = int64(t.nsec()), int64(u.nsec())
  }
 }
 switch {
 case tc < uc:
  return -1
 case tc > uc:
  return +1
 }
 return 0
}

函数内部比较简单。

总结

Go Time 一直都是话题榜上的老面孔。这一次在 Go1.20 的新特性中,对 2006-01-02 15:04:05 常用的时间点进行了常量声明,便于我们后续直接引用,不用 “死记硬背”。

在 Time 对象的比较上,也补全了 Compare 方法,便于两个时间对象之前之后的对比。

Go1.20 将在明年 2023 年 2,3 月份左右就可以见到了。11 月底会发预览版本。冲不?

标签:02,01,15,04,05,2006
From: https://www.cnblogs.com/cheyunhua/p/16900312.html

相关文章

  • 2022.11.17 Java 面向对象的介绍
    属性+方法=类面向过程与面向对象不可分割,面向对象是由一个个面向过程组成,就像教育部由一个个老师组成。面向对象的本质:以类的方式组织代码,以对象的形式组织(封装)数据;......
  • ASEMI代理艾赛斯IXTY02N50D-TRL车规级MOSFET
    编辑-Z艾赛斯车规级MOS管IXTY02N50D-TRL参数:型号:IXTY02N50D-TRL漏极-源极电压(VDS):500V连续漏电流(ID):200mA功耗(PD):25W工作结温度(TJ):-55to+150℃零栅极电压漏极电流(IDSS):10uA漏极......
  • NSSCTF-SWPUCTF2021新生赛之fakerandom
    Day1NSSCTF[SWPUCTF2021新生赛]fakerandom下载源件之后是一个py文件,打开后源码如下随后看到了一个随机数种子,关于随机数种子的知识我了解的不多,只在学校的石头剪刀......
  • 【补题】The 2022 SDUT Summer Trials
    比赛链接The2022SDUTSummerTrialsA.Ginger'snumber样例恶臭(恼)签到题简单分解因数就会发现要求的就是\(gcd\),直接算即可,时间复杂度\(\Theta(Tlog(max(x,y)))\)......
  • 02.编程基本概念
    一、变量与可变性1、变量在Rust语言中,变量默认是不可变的(immutable)。当变量不可变时,一旦值被绑定到一个名称上,你就不能改变这个值。fnmain(){letmutx=5;......
  • 010006 PHP 第一个正式计算长方体的体积公式
    <?phpheader('Content-Type:text/html;charset=utf-8');include'./assets/php/head.php';/***第一个正式计算长方体的体积公式*已知长是47+23,宽是40,高是30......
  • Mac电脑专业编程和数学计算必备工具MATLAB R2022b 完美使用
     mac软件下载:MATLABR2022bforMac怎么安装Mac电脑专业编程和数学计算必备工具MATLABR2022b完美使用资源啊,商业数学软件MATLABR2022更新了,作为数学类科技应用软件......
  • (转)Nginx:04---Nginx的命令行控制
    原文:https://blog.csdn.net/qq_41453285/article/details/106295274在默认的情况下:Nginx安装在/usr/local/nginx/下可执行的Nginx文件为/usr/local/nginx//sbin/nginx默认......
  • 灵雀云ACP 斩获“2022金边奖-最佳云原生边缘云平台”
    近日,由边缘计算社区主办的全球边缘计算大会·上海站成功召开,灵雀云凭借出色的全栈云原生技术实力、专业的高品质服务以及在边缘云场景的丰富落地实践,斩获“2022金边奖-最佳......
  • IFR02红外雨量传感器
    IFR02是通过红外光扫描原理非接触式检测降雨量的传感器(雨量计)。n使用独特的智能学习适应算法,可在复杂光环境中使用,具有很强的抗外部干扰能力。n采用渐变脉宽调制与动态......