Go-carbon v2.3.1 发布:一个简洁、语义化且开发者友好的 Golang 日期时间处理包
Go-carbon v2.3.1 发布:一个简洁、语义化且开发者友好的 Golang 日期时间处理包 Go-carbon v2.3.0 圣诞特别版已发布。这应该是 2023 年的最后一个版本。祝大家圣诞快乐! Carbon 是一个简单、语义化且对开发者友好的 Go 语言日期时间包。
Carbon 已被 awesome-go 收录,如果您觉得它有帮助,请给我一个星标。
github.com/golang-module/carbon
安装
Go 版本 >= 1.16
go get -u github.com/golang-module/carbon/v2
import "github.com/golang-module/carbon/v2"
JSON 处理
定义模型
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Birthday1 Carbon `json:"birthday1"`
Birthday2 Carbon `json:"birthday2" carbon:"date" tz:"PRC"`
Birthday3 Carbon `json:"birthday3" carbon:"time" tz:"PRC"`
Birthday4 Carbon `json:"birthday4" carbon:"dateTime" tz:"PRC"`
}
或
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"`
}
或
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
实例化模型
now := Parse("2020-08-05 13:14:15", PRC)
person := Person {
Name: "gouguoyin",
Age: 18,
Birthday1: now,
Birthday2: now,
Birthday3: now,
Birthday4: now,
}
JSON 编码
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 解码
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 的问题 - 添加基准测试文件
xxx_bench_test.go - 添加格式常量,例如
DateTimeFormat、DateFormat、TimeFormat、AtomFormat、ANSICFormat… - 在
LoadTag方法中,为结构体carbon类型字段的carbon标签添加对datetime、date、time、iso8601和其他字符串的支持 - 在
loadTag函数中,为结构体carbon类型字段的tz标签添加支持,用于设置时区 #207 - 在
ParseByLayout方法中添加对U、V、X、Z格式符号的支持 #206 - 在
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方法的接收器类型从struct更改为pointer
更多关于Go-carbon v2.3.1 发布:一个简洁、语义化且开发者友好的 Golang 日期时间处理包的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Go-carbon v2.3.1 发布:一个简洁、语义化且开发者友好的 Golang 日期时间处理包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go-carbon v2.3.1 的发布确实为Golang的日期时间处理带来了更多便利。JSON序列化和反序列化的标签支持让结构体字段的日期时间格式控制更加灵活,特别是时区标签tz的引入,解决了跨时区数据解析的常见痛点。
以下是一个实际使用示例,展示了如何利用新的标签功能处理API响应中的日期时间数据:
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/golang-module/carbon/v2"
)
type Order struct {
ID int `json:"id"`
Product string `json:"product"`
// 不同格式的日期时间字段
CreatedAt carbon.Carbon `json:"created_at" carbon:"datetime" tz:"UTC"`
PaidAt carbon.Carbon `json:"paid_at" carbon:"date" tz:"Asia/Shanghai"`
ExpiresAt carbon.Carbon `json:"expires_at" carbon:"layout:2006-01-02T15:04:05Z07:00"`
}
func main() {
// 模拟API响应数据
apiResponse := `{
"id": 1001,
"product": "Go Programming Book",
"created_at": "2023-12-25 08:30:00",
"paid_at": "2023-12-26",
"expires_at": "2024-12-25T23:59:59+08:00"
}`
var order Order
// 加载标签配置
if err := carbon.LoadTag(&order); err != nil {
log.Fatal(err)
}
// 反序列化JSON
if err := json.Unmarshal([]byte(apiResponse), &order); err != nil {
log.Fatal(err)
}
// 输出解析结果
fmt.Printf("订单创建时间: %s\n", order.CreatedAt.ToDateTimeString())
fmt.Printf("支付日期: %s\n", order.PaidAt.ToDateString())
fmt.Printf("到期时间: %s\n", order.ExpiresAt.ToRfc3339String())
// 时区转换示例
fmt.Printf("创建时间(北京时间): %s\n",
order.CreatedAt.SetTimezone("Asia/Shanghai").ToDateTimeString())
}
新版本中ParseByLayout方法对扩展格式符号的支持也很实用:
// 解析带时区标识的字符串
c := carbon.ParseByLayout("2023-12-25T10:30:00Z", carbon.RFC3339Layout, carbon.UTC)
fmt.Println(c.ToDateTimeString()) // 2023-12-25 10:30:00
// 使用新支持的格式符号
c2 := carbon.ParseByLayout("2023 52 1", "2006 V 1", carbon.UTC)
fmt.Println(c2.ToDateString()) // 2023-12-25
基准测试文件的添加让性能优化更有依据,格式常量的引入也提高了代码可读性:
// 使用预定义格式常量
now := carbon.Now()
fmt.Println(now.Format(carbon.DateTimeFormat)) // 2023-12-25 10:30:00
fmt.Println(now.Format(carbon.ANSICFormat)) // Mon Dec 25 10:30:00 2023
fmt.Println(now.Format(carbon.RFC822Format)) // 25 Dec 23 10:30 UTC
SetTestNow方法接收器类型的变更需要注意:
// v2.3.1 之前
carbon.SetTestNow(carbon.Now()) // 静态方法调用
// v2.3.1 之后需要获取实例
c := carbon.Now()
c.SetTestNow(carbon.Parse("2023-12-25"))
这些改进确实让日期时间处理更加语义化和开发者友好,特别是JSON集成方面的工作,大大简化了Web开发中的时间数据处理流程。

