简介

不管什么时候,处理时间总是让人头疼的一件事情。因为时间格式太多样化了,再加上时区,夏令时,闰秒这些细枝末节处理起来更是困难。所以在程序中,涉及时间的处理我们一般借助于标准库或第三方提供的时间库。今天要介绍的dateparse专注于一个很小的时间处理领域——解析日期时间格式的字符串。

快速使用

本文代码使用 go modules。

创建目录并初始化:

安装dateparse库:

使用:

parseany()方法接受一个日期时间字符串,解析该字符串,返回time.time类型的值。如果传入的字符串dateparse库无法识别,则返回一个错误。上面程序运行输出:

$ go run main.go
2014-03-01 00:00:00
2021/06/24 14:52:39 could not find format for “mm/dd/yyyy”
exit status 1

需要注意,当我们写出”3/1/2014″这个时间的时候,可以解释为2014年3月1日,也可以解释为2014年1月3日。这就存在二义性,dateparse默认采用mm/dd/yyyy这种格式,也就是2014年3月1日。我们也可以使用parsestrict()函数让这种具有二义性的字符串解析失败:

运行:

$ go run main.go
2021/06/24 14:57:18 this date has ambiguous mm/dd vs dd/mm type format
exit status 1

格式

dateparse支持丰富的日期时间格式,基本囊括了所有常用的格式。它支持标准库time中预定义的所有格式:

支持的完整格式查看dateparse readme。

时区

dateparse支持在特定时区解析日期时间字符串。我们可以通过调用标准库的time.loadlocation()方法,传入时区标识字符串来获得时区对象。时区标识字符串是类似asia/shanghai,america/chicago这样的格式,它表示一个具体的时区,前者上海,后者洛杉矶。调用dateparse.parsein()方法传入时区对象,在指定时区中解析。time包中还预定义了两个时区对象,time.local表示本地时区,time.utc表示 utc 时区。时区的权威数据请看iana。

运行:

$ go run main.go
2021-06-25 04:50:30
2021-06-24 15:50:30

美国洛杉矶时区的”2021年6月24日 15时30分30秒”等于本地时区(北京时间)的”2021年6月25日 04时50分30秒”。

cli

dateparse还提供了一个命令行工具,用于极快地查看日期时间格式。安装:

默认会安装在$gopath路径下,我习惯上把$gopath/bin放到$path中。所以dateparse命令可以直接使用。
dateparse命令接收一个字符串,和一个可选的时区选项:

输出当前本地时区,格式字符串(可用于生成同样格式的日期时间字符串)和一个表格。表格里面的数据是分别对parseany/parsein/parselocal/parsestrict在不同的时区下调用的结果。

method列表示调用的方法,zone source列表示将本地时区设置的值,parsed列是以日期时间字符串调用parseany()返回的time.time对象的format()方法调用结果,parsed: t.in(time.utc)列在返回的time.time对象调用format()方法前将其转为 utc 时间。

由于parseany/parsestrict不会考虑本地时区,都是在 utc 下解析字符串,所以这 6 行的最后两列结果都一样。

parsein的第二行,将time.local设置为我们通过命令行选项设置的时区,上面我设置为asia/shanghai,对应的 utc 时间相差 8 小时。parselocal也是如此。

下面是dateparse命令行的部分源码,可以对照查看:

注意输出的本地时区为 cst,它可以代表不同的时区:

central standard time (usa) ut-6:00
central standard time (australia) ut+9:30
china standard time ut+8:00
cuba standard time ut-4:00

cst 可以同时表示美国、澳大利亚、中国和古巴四个国家的标准时间。

总结

使用dateparse可以很方便地从日期时间字符串中解析出时间对象和格式(layout)。同时dateparse命令行可以快速的查看和转换相应时区的时间,是一个非常不错的小工具。

大家如果发现好玩、好用的 go 语言库,欢迎到 go 每日一库 github 上提交 issue

参考

dateparse github:
go 每日一库 github:

到此这篇关于go每日一库之dateparse处理时间的文章就介绍到这了,更多相关go dateparse处理时间内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!