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 标签增加对 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 方法中接收者类型从 结构体 更改为 指针
相关推荐
高频因子挖掘机15 分钟前
量化回测应该保存不复权数据吗?从数据口径到收益计算的工程实践
后端·github·api
高频因子挖掘机1 小时前
实时行情为什么不应该逐只股票请求?批量查询与标的池管理实践
后端·github·api
程序猿DD6 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
余槐i9 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8269 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
死磕音视频10 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林10 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne11 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF12 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li12 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉