1.  
  2. 主页
  3.  / 
  4. Go 每日一库
  5.  / 
  6. Go 每日一库之 carbon 使用详解

Go 每日一库之 carbon 使用详解

简介

一线开发人员每天都要使用日期和时间相关的功能,各种定时器,活动时间处理等。

标准库time使用起来不太灵活,特别是日期时间的创建和运算。

carbon库是一个时间扩展库,基于 PHP 的carbon库编写。提供易于使用的接口。

本文就来介绍一下这个库。

快速使用

第三方库需要先安装:

后使用:

carbon库的使用很便捷,首先它完全兼容标准库的time.Time类型,实际上该库的日期时间类型Carbon直接将time.Time内嵌到结构中,所以time.Time的方法可直接调用:

其次,简化了创建操作。标准库time创建一个Time对象,如果不是本地或 UTC 时区,需要自己先调用LoadLocation加载对应时区。然后将该时区对象传给time.Date方法创建。carbon可以直接传时区名字。

carbon还提供了很多方法做日期运算,如例子中的AddDaySubWeek等,都是见名知义的。

时区

在介绍其它内容之前,我们先说一说这个时区的问题。以下引用维基百科的描述:

时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。1863年,首次使用时区的概念。时区通过设立一个区域的标准时间部分地解决了这个问题。
世界各国位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差。这些偏差就是所谓的时差。

例如,日本东京位于东九区,北京位于东八区,所以日本比中国快一个小时,日本14:00的时候中国13:00。

在 Linux 中,时区一般存放在类似/usr/share/zoneinfo这样的目录。这个目录中有很多文件,每个时区一个文件。时区文件是二进制文件,可以执行info tzfile查看具体格式。

时区名称的一般格式为city,或country/city,或continent/city。即要么就是一个城市名,要么是国家名+/+城市名,要么是洲名+/+城市名。例如上海时区为Asia/Shanghai,香港时区为Asia/Hong_Kong。也有一些特殊的,如 UTC,Local等。

Go 语言为了可移植性,在安装包中提供了时区文件,在安装目录下的lib/time/zoneinfo.zip文件,大家可以执行解压看看。

使用 Go 标准库time创建某个时区的时间,需要先加载时区:

使用carbon就不用这么麻烦:

时间运算

使用标准库time的时间运算需要先定义一个time.Duration对象,time库预定义的只有纳秒到小时的精度:

其它的时长就需要自己使用time.ParseDuration构造了,而且time.ParseDuration不能构造其它精度的时间。

如果想要增加/减少年月日,就需要使用time.TimeAddDate方法:

需要注意的是,时间操作都是返回一个新的对象,原对象不会修改。

carbon库也是如此。Go 的标准库也建议我们不要使用time.Time的指针

当然carbon库也能使用上面的方法,它还提供了多种粒度的方法:

carbon还提供了:

  • 增加季度的方法:AddQuarters/AddQuarter,复数形式介绍一个表示倍数的参数,单数形式倍数为1;
  • 增加世纪的方法:AddCenturies/AddCentury
  • 增加工作日的方法:AddWeekdays/AddWeekday,这个方法会跳过非工作日;
  • 增加的方法:AddWeeks/AddWeek

其实给上面方法传入负数就表示减少,另外carbon也提供了对应的Sub*方法。

时间比较

标准库time可以使用time.Time对象的Before/After/Equal判断是否在另一个时间对象前,后,或相等。

carbon库也可以使用上面的方法比较时间。除此之外,它还提供了多组方法,每个方法提供一个简短名,一个详细名:

  • Eq/EqualTo:是否相等;
  • Ne/NotEqualTo:是否不等;
  • Gt/GreaterThan:是否在之后;
  • Lt/LessThan:是否在之前;
  • Lte/LessThanOrEqual:是否相同或在之前;
  • Between:是否在两个时间之间。

另外carbon提供了:

  • 判断当前时间是周几的方法:IsMonday/IsTuesday/.../IsSunday
  • 是否是工作日,周末,闰年,过去时间还是未来时间:IsWeekday/IsWeekend/IsLeapYear/IsPast/IsFuture

我们还可以使用carbon计算两个日期之间相差多少秒、分、小时、天:

格式化

我们知道time.Time提供了一个Format方法,相比于其他编程语言使用格式化符来描述格式(需要记忆%d/%m/%h等的含义),Go 提供了一个一种更简单、直观的方式——使用 layout。即我们传入一个日期字符串,表示我们想要格式化成什么样子。Go 会用当前的时间替换字符串中的对应部分:

上面我们只需要传入一个2006-01-02 10:00:00表示我们想要的格式为yyyy-mm-dd hh:mm:ss,省去了我们需要记忆的麻烦。

为了使用方便,Go 内置了一些标准的时间格式:

除了上面这些格式,carbon还提供了其他一些格式:

注意一点,time库默认使用2006-01-02 15:04:05.999999999 -0700 MST格式,有点复杂了,carbon库默认使用更简洁的2006-01-02 15:04:05

高级特性

修饰器

所谓修饰器(modifier)就是对一些特定的时间操作,获取开始和结束时间。如当天、月、季度、年、十年、世纪、周的开始和结束时间,还能获得上一个周二、下一个周一、下一个工作日的时间等等:

自定义工作日和周末

有些地区每周的开始、周末和我们的不一样。例如,在美国周日是新的一周开始。没关系,carbon可以自定义每周的开始和周末:

总结

carbon提供了很多的实用方法,另外time的方法它也能使用,使得它的功能非常强大。时间其实是一个非常复杂的问题,考虑到时区、闰秒、各地的夏令时等,自己处理起来简直是火葬场。幸好有这些库(┬_┬)

参考

  1. carbon GitHub 仓库:https://github.com/uniplaces/carbon
这篇文章对您有用吗?

我们要如何帮助您?

发表评论

邮箱地址不会被公开。 必填项已用*标注