我们在日常开发中,常常会对时间进行各种处理,今天我来介绍一个 go 处理时间的库 golang-module/carbon。

Carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。

安装

go版本大于 1.16

1
go get -u github.com/golang-module/carbon/v2

版本小于 1.16

1
go get -u github.com/golang-module/carbon

使用

创建 carbon 实例

1
2
3
4
5
carbon.Now() // 获取当前时间
carbon.Now("Asia/Qatar").ToDateTimeString() // 不同时区当前的时间,卡塔尔当前的时间
carbon.Yesterday() // 昨天
carbon.CreateFromTime(22, 9, 13).ToString()
carbon.Tomorrow().ToDateString() // 明天

标准库转换

carbon 还可以和标准库 time 进行相互转换。

1
2
3
// 将 标准库 time 转换为 carbon 实例
carbon.Time2Carbon(time.Now())
// carbon 转换为 time.Time

解析字符串

carbon 可以解析字符串,生成carbon 实例

1
2
3
4
5
6
7
// 将时间字符串转换为 carbon 实例
fmt.Println(carbon.Parse("1998-04-01").ToDateTimeString())
carbon.Parse("tomorrow").ToString()
carbon.ParseByFormat("2020|08|05 13|14|15", "Y|m|d H|i|s").ToDateTimeString() // 2020-08-05 13:14:15
carbon.ParseByFormat("It is 2020-08-05 13:14:15", "\\I\\t \\i\\s Y-m-d H:i:s").ToDateTimeString() // 2020-08-05 13:14:15
carbon.ParseByFormat("今天是 2020年08月05日13时14分15秒", "今天是 Y年m月d日H时i分s秒").ToDateTimeString() // 2020-08-05 13:14:15
carbon.ParseByFormat("2020-08-05 13:14:15", "Y-m-d H:i:s", carbon.Tokyo).ToDateTimeString() // 2020-08-05 14:14:15

获取开始时间和结束时间

carbon 可以很方便的获取一个时刻的开始和结束

1
2
3
4
5
6
// 获取本世纪的开始
fmt.Println(carbon.Parse("2020-08-05 13:14:15").StartOfCentury().ToDateTimeString())
// 本世纪结束时间
fmt.Println(carbon.Parse("2020-08-05 13:14:15").EndOfCentury().ToDateTimeString())
// 本年结束时间
carbon.Parse("2020-08-05 13:14:15").EndOfYear().ToDateTimeString() 

时间旅行

carbon 实现了时间旅行的功能,增加或减少时间可以到达另一个时间点

1
2
3
4
5
6
7
8
// 三个世纪后
carbon.Parse("2020-02-29 13:14:15").AddCenturies(3).ToDateTimeString() // 2320-02-29 13:14:15
// 一个世纪后(月份不溢出)
carbon.Parse("2020-02-29 13:14:15").AddCenturyNoOverflow().ToDateTimeString() 
// 30 天后
fmt.Println(carbon.Now().AddDays(30).ToDateTimeString())
// 30天前
fmt.Println(carbon.Now().SubDays(30).ToDateTimeString())

时间差

1
carbon.Parse("2020-08-05 13:14:15").DiffInSeconds(carbon.Parse("2020-08-05 13:14:14")) // -1

例子

接下来看看实际的例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
	"fmt"
	"github.com/golang-module/carbon/v2"
	"time"
)

func main() {
	fmt.Printf("%s\n", carbon.Now())
	fmt.Printf("%s\n", carbon.CreateFromTimestamp(0).ToString())
	fmt.Println(carbon.Now("Asia/Qatar").ToDateTimeString())
	fmt.Println(carbon.CreateFromTime(22, 9, 13).ToString())
	fmt.Println(carbon.Parse("1998-04-01").ToDateTimeString())
	fmt.Println(carbon.Time2Carbon(time.Now()))
	fmt.Println(carbon.Now().Carbon2Time())
	fmt.Println(carbon.Parse("2020-08-05 13:14:15").StartOfCentury().ToDateTimeString())
	fmt.Println(carbon.Parse("2020-08-05 13:14:15").EndOfCentury().ToDateTimeString())
	fmt.Println(carbon.Parse("2020-02-29 13:14:15").AddCenturies(3).ToDateTimeString())
	fmt.Println(carbon.Now().AddDays(30).ToDateTimeString())
	fmt.Println(carbon.Now().SubDays(30).ToDateTimeString())

}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
2022-12-03 23:51:28
1970-01-01 08:00:00 +0800 CST
2022-12-03 18:51:28
2022-12-03 22:09:13.9376781 +0800 CST
1998-04-01 00:00:00
2022-12-03 23:51:28
2022-12-03 23:51:28.9376781 +0800 CST
2000-01-01 00:00:00
2099-12-31 23:59:59
2320-02-29 13:14:15
2023-01-02 23:51:28
2022-11-03 23:51:28

小结

本文主要结束了一个时间处理库 carbon, 从文档来看,carbon 提供的功能特别丰富,让你不用做额外的处理。

参考