carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。
目前已被 [awesome-go]( https://github.com/avelino/awesome-go#date-and-time "awesome-go") 收录,如果您觉得不错,请给个 star 吧
[github.com/golang-module/carbon]( https://github.com/golang-module/carbon "github.com/golang-module/carbon")
[gitee.com/golang-module/carbon]( https://gitee.com/golang-module/carbon "gitee.com/golang-module/carbon")
#### 安装使用
##### Golang 版本大于等于 1.16
```go
// 使用 github 库
go get -u github.com/golang-module/carbon/v2
import "github.com/golang-module/carbon/v2"
// 使用 gitee 库
go get -u gitee.com/golang-module/carbon/v2
import "gitee.com/golang-module/carbon/v2"
```
##### Golang 版本小于 1.16
```go
// 使用 github 库
go get -u github.com/golang-module/carbon
import "github.com/golang-module/carbon"
// 使用 gitee 库
go get -u gitee.com/golang-module/carbon
import "gitee.com/golang-module/carbon"
```
##### 定义模型
```go
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Birthday carbon.Carbon `json:"birthday" carbon:"layout:2006-01-02"`
GraduatedAt carbon.Carbon `json:"graduated_at" carbon:"layout:15:04:05"`
CreatedAt carbon.Carbon `json:"created_at" carbon:"layout:2006-01-02 15:04:05"`
}
```
或
```go
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Birthday1 Carbon `json:"birthday1"`
Birthday2 Carbon `json:"birthday2" carbon:"layout:2006-01-02" tz:"PRC"`
Birthday3 Carbon `json:"birthday3" carbon:"layout:15:04:05" tz:"PRC"`
Birthday4 Carbon `json:"birthday4" carbon:"layout:2006-01-02 15:04:05" tz:"PRC"`
}
```
或
```go
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Birthday1 Carbon `json:"birthday1"`
Birthday2 Carbon `json:"birthday2" carbon:"format:Y-m-d" tz:"PRC"`
Birthday3 Carbon `json:"birthday3" carbon:"format:H:i:s" tz:"PRC"`
Birthday4 Carbon `json:"birthday4" carbon:"format:Y-m-d H:i:s" tz:"PRC"`
}
```
> 如果 `carbon` 标签没有设置,默认是 `layout:2006-01-02 15:04:05`;如果 `tz` 标签没有设置,默认是 `Local`
##### 实例化模型
```go
now := Parse("2020-08-05 13:14:15", PRC)
person := Person {
Name: "gouguoyin",
Age: 18,
Birthday1: now,
Birthday2: now,
Birthday3: now,
Birthday4: now,
}
```
##### JSON 编码
```go
loadErr := carbon.LoadTag(&person)
if loadErr != nil {
// 错误处理
log.Fatal(loadErr)
}
data, marshalErr := json.Marshal(person)
if marshalErr != nil {
// 错误处理
log.Fatal(marshalErr)
}
fmt.Printf("%s", data)
// 输出
{
"name": "gouguoyin",
"age": 18,
"birthday1": "2020-08-05 13:14:15",
"birthday2": "2020-08-05",
"birthday3": "13:14:15",
"birthday4": "2020-08-05 13:14:15"
}
```
##### JSON 解码
```go
str := `{
"name": "gouguoyin",
"age": 18,
"birthday1": "2020-08-05 13:14:15",
"birthday2": "2020-08-05",
"birthday3": "13:14:15",
"birthday4": "2020-08-05 13:14:15"
}`
var person Person
loadErr := carbon.LoadTag(&person)
if loadErr != nil {
// 错误处理
log.Fatal(loadErr)
}
unmarshalErr := json.Unmarshal([]byte(str), &person)
if unmarshalErr != nil {
// 错误处理
log.Fatal(unmarshalErr)
}
fmt.Sprintf("%s", person.Birthday1) // 2002-08-05 13:14:15
fmt.Sprintf("%s", person.Birthday2) // 2020-08-05
fmt.Sprintf("%s", person.Birthday3) // 13:14:15
fmt.Sprintf("%s", person.Birthday4) // 2002-08-05 13:14:15
```
#### 更新日志
- 修复在 `Now` 方法中设置测试时间时 `testNow` 为 0,造成 `IsSetTestNow` 方法返回 `false` 的 bug
- 添加性能测试文件 `xxx_bench_test.go`
- 增加格式模板常量,如 `DateTimeFormat`, `DateFormat`, `TimeFormat`, `AtomFormat`, `ANSICFormat`
- 在 `loadTag` 函数中 `carbon` 标签增加对 `datetime`、`date`、`time`、`iso8601` 等字符串的支持
- 在 `loadTag` 函数中新增 `tz` 标签,用于设置时区
- 在 `ParseByLayout` 方法中添加对 `U`、`V`、`X`、`Z` 格式化符号的支持
- 在 `ToFormatString` 或 `Format` 方法中添加对 `v`、`u`、`x` 格式符号的支持
- 将 `ClearTestNow` 方法重命名为 `UnSetTestNow`
- 将 `HasTestNow` 方法重命名为 `IsSetTestNow`
- 将 `xxx_test.go` 文件重命名为 `xxx_unit_test.go`
- 将 `json.go` 文件重命名为 `encoding.go`, `json_test.go` 文件重命名为 `encoding_unit_test.go`
- 将 `Closest` 和 `Farthest` 方法从 `traveler.go` 文件移动到 `extremum.go`,从 `traveler_test.go` 文件移动到 `extremum_unit_test.go`
- 将 `SetTestNow` 方法中接收者类型从 `结构体` 更改为 `指针`
有疑问加站长微信联系(非本文作者)