V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gouguoyin
V2EX  ›  程序员

go-carbon v2.3.1 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

  •  
  •   gouguoyin · 330 天前 · 816 次点击
    这是一个创建于 330 天前的主题,其中的信息可能已经有所发展或是发生改变。

    carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。

    目前已被 awesome-go 收录,如果您觉得不错,请给个 star 吧

    github.com/golang-module/carbon

    gitee.com/golang-module/carbon

    安装使用

    Golang 版本大于等于 1.16
    // 使用 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
    // 使用 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"
    
    定义模型
    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"`
    }
    

    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"`
    }
    

    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

    实例化模型
    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 编码
    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 解码
    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 标签增加对 datetimedatetimeiso8601 等字符串的支持
    • loadTag 函数中新增 tz 标签,用于设置时区
    • ParseByLayout 方法中添加对 UVXZ 格式化符号的支持
    • 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
    • SetTestNow 方法中接收者类型从 结构体 更改为 指针
    2 条回复    2023-12-29 16:33:42 +08:00
    jfjiefan
        1
    jfjiefan  
       330 天前
    在用
    gouguoyin
        2
    gouguoyin  
    OP
       330 天前
    @jfjiefan 欢迎使用,欢迎提出宝贵意见,新版关于对 json 自定义编码解码的处理你有什么看法么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2714 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:49 · PVG 17:49 · LAX 01:49 · JFK 04:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.