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
更新日志
  • 修复了 DiffInYearsAge 方法中的错误 #181
  • 修复了 json.Unmarshal 后时区丢失的错误 #178
  • CreateFromStdTime 方法从 carbon.go 移至 creator.go
  • ToStdTime 方法从 carbon.go 移至 outputer.go
  • 将已弃用的方法 FromStdTimeTime2CarbonCarbon2Time 移至 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日期时间处理包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


很酷,非常有帮助,谢谢

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开发和数据库操作中,能够保持时间数据的一致性。

回到顶部