go-carbon v2.3.1 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

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

目前已被 awesome-go 收录,如果您觉得不错,请给个 star 吧

github.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"`
    
    Birthday0 Carbon `json:"birthday0"`
    Birthday1 Carbon `json:"birthday1" carbon:"date"`
    Birthday2 Carbon `json:"birthday2" carbon:"time"`
    Birthday3 Carbon `json:"birthday3" carbon:"dateTime"`
    Birthday4 Carbon `json:"birthday4" carbon:"date" tz:"PRC"`
    Birthday5 Carbon `json:"birthday5" carbon:"time" tz:"PRC"`
    Birthday6 Carbon `json:"birthday6" carbon:"dateTime" tz:"PRC"`
}

go 复制代码
type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    
    Birthday0 Carbon `json:"birthday0"`
    Birthday1 Carbon `json:"birthday1" carbon:"layout:2006-01-02"`
    Birthday2 Carbon `json:"birthday2" carbon:"layout:15:04:05"`
    Birthday3 Carbon `json:"birthday3" carbon:"layout:2006-01-02 15:04:05"`
    Birthday4 Carbon `json:"birthday4" carbon:"layout:2006-01-02" tz:"PRC"`
    Birthday5 Carbon `json:"birthday5" carbon:"layout:15:04:05" tz:"PRC"`
    Birthday6 Carbon `json:"birthday6" carbon:"layout:2006-01-02 15:04:05" tz:"PRC"`
}

go 复制代码
type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    
    Birthday0 Carbon `json:"birthday0"`
    Birthday1 Carbon `json:"birthday1" carbon:"format:Y-m-d"`
    Birthday2 Carbon `json:"birthday2" carbon:"format:H:i:s"`
    Birthday3 Carbon `json:"birthday3" carbon:"format:Y-m-d H:i:s"`
    Birthday4 Carbon `json:"birthday4" carbon:"format:Y-m-d" tz:"PRC"`
    Birthday5 Carbon `json:"birthday5" carbon:"format:H:i:s" tz:"PRC"`
    Birthday6 Carbon `json:"birthday6" 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,
	
    Birthday0: now,
    Birthday1: now,
    Birthday2: now,
    Birthday3: now,
    Birthday4: now,
    Birthday5: now,
    Birthday6: 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,
    "birthday0": "2020-08-05 13:14:15",
    "birthday1": "2020-08-05",
    "birthday2": "13:14:15",
    "birthday3": "2020-08-05 13:14:15",
    "birthday4": "2020-08-05",
    "birthday5": "213:14:15",
    "birthday6": "2020-08-05 13:14:15"
}
JSON 解码
go 复制代码
str := `{
    "name": "gouguoyin",
    "age": 18,
    "birthday0": "2020-08-05 13:14:15",
    "birthday1": "2020-08-05",
    "birthday2": "13:14:15",
    "birthday3": "2020-08-05 13:14:15",
    "birthday4": "2020-08-05",
    "birthday5": "213:14:15",
    "birthday6": "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.Birthday0) // 2002-08-05 13:14:15
fmt.Sprintf("%s", person.Birthday1) // 2020-08-05
fmt.Sprintf("%s", person.Birthday2) // 13:14:15
fmt.Sprintf("%s", person.Birthday3) // 2002-08-05 13:14:15
fmt.Sprintf("%s", person.Birthday4) // 2002-08-05
fmt.Sprintf("%s", person.Birthday5) // 13:14:15
fmt.Sprintf("%s", person.Birthday6) // 2002-08-05 13:14:15
更新日志
  • 修复在 Now 方法中设置测试时间时 testNow 为 0,造成 IsSetTestNow 方法返回 false 的 bug
  • 添加性能测试文件 xxx_bench_test.go
  • 增加格式模板常量,如 DateTimeFormat, DateFormat, TimeFormat, AtomFormat, ANSICFormat
  • loadTag 函数中 carbon 标签增加对 datetimedatetimeiso8601 等字符串的支持
  • loadTag 函数中新增 tz 标签,用于设置时区
  • ParseByLayout 方法中添加对 UVXZ 格式化符号的支持
  • ToFormatStringFormat 方法中添加对 vux 格式符号的支持
  • ClearTestNow 方法重命名为 UnSetTestNow
  • HasTestNow 方法重命名为 IsSetTestNow
  • xxx_test.go 文件重命名为 xxx_unit_test.go
  • json.go 文件重命名为 encoding.go, json_test.go 文件重命名为 encoding_unit_test.go
  • ClosestFarthest 方法从 traveler.go 文件移动到 extremum.go,从 traveler_test.go 文件移动到 extremum_unit_test.go
  • SetTestNow 方法中接收者类型从 结构体 更改为 指针
相关推荐
序安InToo4 分钟前
第6课|注释与代码风格
后端·操作系统·嵌入式
xyy1234 分钟前
C#: Newtonsoft.Json 到 System.Text.Json 迁移避坑指南
后端
洋洋技术笔记7 分钟前
Spring Boot Web MVC配置详解
spring boot·后端
JxWang057 分钟前
VS Code 配置 Markdown 环境
后端
navms11 分钟前
搞懂线程池,先把 Worker 机制啃明白
后端
JxWang0511 分钟前
离线数仓的优化及重构
后端
Nyarlathotep011312 分钟前
gin01:初探gin的启动
后端·go
JxWang0512 分钟前
安卓手机配置通用多屏协同及自动化脚本
后端
JxWang0514 分钟前
Windows Terminal 配置 oh-my-posh
后端
SimonKing30 分钟前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员