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
  • 添加格式常量,例如 DateTimeFormatDateFormatTimeFormatAtomFormatANSICFormat
  • LoadTag 方法中,为结构体 carbon 类型字段的 carbon 标签添加对 datetimedatetimeiso8601 和其他字符串的支持
  • loadTag 函数中,为结构体 carbon 类型字段的 tz 标签添加支持,用于设置时区 #207
  • ParseByLayout 方法中添加对 UVXZ 格式符号的支持 #206
  • 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
  • :warning:SetTestNow 方法的接收器类型从 struct 更改为 pointer

更多关于Go-carbon v2.3.1 发布:一个简洁、语义化且开发者友好的 Golang 日期时间处理包的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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开发中的时间数据处理流程。

回到顶部