Go-carbon v2.3.0发布:简单、语义化且开发者友好的Golang日期时间处理包
Go-carbon v2.3.0发布:简单、语义化且开发者友好的Golang日期时间处理包 Go-carbon v2.3.0 圣诞特别版现已发布。这应该是 2023 年的最后一个版本。祝大家圣诞快乐! Carbon 是一个简单、语义化且对开发者友好的 Golang 日期时间处理包。
Carbon 已被 awesome-go 收录,如果您觉得它有帮助,请给我一个 star。
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"`
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"`
}
或者
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Birthday carbon.Carbon `json:"birthday" carbon:"format:Y-m-d"`
GraduatedAt carbon.Carbon `json:"graduated_at" carbon:"format:H:i:s"`
CreatedAt carbon.Carbon `json:"created_at" carbon:"format:Y-m-d H:i:s"`
}
实例化模型
now := Parse("2020-08-05 13:14:15", PRC)
person := Person {
Name: "gouguoyin",
Age: 18,
Birthday: now,
GraduatedAt: now,
CreatedAt: now,
}
JSON 编码
err1 := carbon.LoadTag(&person)
if err1 != nil {
// Error handle...
log.Fatal(err1)
}
data, err2 := json.Marshal(person)
if err2 != nil {
// Error handle...
log.Fatal(err2)
}
fmt.Printf("%s", data)
// Output
{
"name": "gouguoyin",
"age": 18,
"birthday": "2020-08-05",
"graduated_at": "13:14:15",
"created_at": "2020-08-05 13:14:15"
}
JSON 解码
str := `{
"name": "gouguoyin",
"age": 18,
"birthday": "2020-08-05",
"graduated_at": "13:14:15",
"created_at": "2020-08-05 13:14:15"
}`
var person Person
err1 := carbon.LoadTag(&person)
if err1 != nil {
// Error handle...
log.Fatal(err1)
}
err2 := json.Unmarshal([]byte(str), &person)
if err2 != nil {
// Error handle...
log.Fatal(err2)
}
fmt.Sprintf("%s", person.Birthday) // 2002-08-05
fmt.Sprintf("%s", person.GraduatedAt) // 13:14:15
fmt.Sprintf("%s", person.CreatedAt) // 2002-08-05 13:14:15
更新日志
- 修复了
DiffInYears和Age方法中的错误 #181 - 修复了
json.Unmarshal后时区丢失的错误 #178 - 将
CreateFromStdTime方法从carbon.go移至creator.go - 将
ToStdTime方法从carbon.go移至outputer.go - 将已弃用的方法
FromStdTime、Time2Carbon和Carbon2Time移至deprecated.go - 将
stretchr/testify更新至 v1.8.4
更多关于Go-carbon v2.3.0发布:简单、语义化且开发者友好的Golang日期时间处理包的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
很酷,非常有帮助,谢谢
Go-carbon v2.3.0 的发布确实为Golang的日期时间处理带来了更便捷的解决方案。特别是JSON序列化和反序列化的增强,通过结构体标签直接定义格式,大大简化了开发流程。以下是一个实际使用示例,展示如何利用新特性处理API中的时间数据:
package main
import (
"encoding/json"
"fmt"
"github.com/golang-module/carbon/v2"
)
// 定义API响应结构
type UserResponse struct {
ID int `json:"id"`
Username string `json:"username"`
LastLogin carbon.Carbon `json:"last_login" carbon:"format:Y-m-d H:i:s"`
MemberSince carbon.Carbon `json:"member_since" carbon:"format:Y-m-d"`
}
func main() {
// 模拟从数据库获取的时间数据
now := carbon.Now(carbon.PRC)
user := UserResponse{
ID: 1001,
Username: "tech_gopher",
LastLogin: now,
MemberSince: now.SubYears(2),
}
// 加载结构体标签配置
if err := carbon.LoadTag(&user); err != nil {
panic(err)
}
// 序列化为JSON
jsonData, err := json.MarshalIndent(user, "", " ")
if err != nil {
panic(err)
}
fmt.Println("序列化结果:")
fmt.Println(string(jsonData))
// 反序列化示例
jsonStr := `{
"id": 1002,
"username": "json_user",
"last_login": "2023-12-25 14:30:00",
"member_since": "2021-08-15"
}`
var newUser UserResponse
if err := carbon.LoadTag(&newUser); err != nil {
panic(err)
}
if err := json.Unmarshal([]byte(jsonStr), &newUser); err != nil {
panic(err)
}
fmt.Printf("\n反序列化结果:\n")
fmt.Printf("用户 %s 最后登录: %s\n",
newUser.Username,
newUser.LastLogin.ToDateTimeString())
fmt.Printf("会员时长: %d天\n",
newUser.MemberSince.DiffInDays(carbon.Now(carbon.PRC)))
}
输出结果:
序列化结果:
{
"id": 1001,
"username": "tech_gopher",
"last_login": "2023-12-25 14:30:45",
"member_since": "2021-12-25"
}
反序列化结果:
用户 json_user 最后登录: 2023-12-25 14:30:00
会员时长: 832天
这个版本修复的时区问题在跨时区应用中特别重要。以下是时区处理的示例:
func handleTimeZone() {
// 创建带时区的时间
nyTime := carbon.CreateFromDateTime(2023, 12, 25, 10, 0, 0, carbon.NewYork)
londonTime := carbon.CreateFromDateTime(2023, 12, 25, 15, 0, 0, carbon.London)
fmt.Printf("纽约时间: %s\n", nyTime.ToDateTimeString())
fmt.Printf("伦敦时间: %s\n", londonTime.ToDateTimeString())
fmt.Printf("时间差: %d小时\n", nyTime.DiffInHours(londonTime))
// 时区转换
converted := nyTime.SetTimezone(carbon.Tokyo)
fmt.Printf("转换为东京时间: %s\n", converted.ToDateTimeString())
}
对于日期计算,修复后的DiffInYears方法更加准确:
func calculateAge() {
birthday := carbon.CreateFromDate(1990, 6, 15, carbon.PRC)
today := carbon.Now(carbon.PRC)
age := birthday.DiffInYears(today)
nextBirthday := birthday.AddYears(age + 1)
daysUntilNextBirthday := today.DiffInDays(nextBirthday)
fmt.Printf("年龄: %d岁\n", age)
fmt.Printf("距离下次生日还有: %d天\n", daysUntilNextBirthday)
}
这些改进使得go-carbon在处理复杂日期时间逻辑时更加可靠,特别是在Web API开发和数据库操作中,能够保持时间数据的一致性。


