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

AlgoSolarStrider
• 阅读 240

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

    Birthday5 Carbon `json:"birthday5" carbon:"timestamp" tz:"PRC"`
    Birthday6 Carbon `json:"birthday6" carbon:"timestampMilli" tz:"PRC"`
    Birthday7 Carbon `json:"birthday7" carbon:"timestampMicro" tz:"PRC"`
    Birthday8 Carbon `json:"birthday8" carbon:"timestampNano" 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"`
    
    Birthday5 Carbon `json:"birthday5" carbon:"timestamp" tz:"PRC"`
    Birthday6 Carbon `json:"birthday6" carbon:"timestampMilli" tz:"PRC"`
    Birthday7 Carbon `json:"birthday7" carbon:"timestampMicro" tz:"PRC"`
    Birthday8 Carbon `json:"birthday8" carbon:"timestampNano" 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"`

    Birthday5 Carbon `json:"birthday5" carbon:"timestamp" tz:"PRC"`
    Birthday6 Carbon `json:"birthday6" carbon:"timestampMilli" tz:"PRC"`
    Birthday7 Carbon `json:"birthday7" carbon:"timestampMicro" tz:"PRC"`
    Birthday8 Carbon `json:"birthday8" carbon:"timestampNano" 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,
    Birthday5: now,
    Birthday6: now,
    Birthday7: now,
    Birthday8: 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",
    "birthday5": 1596604455,
    "birthday6": 1596604455999,
    "birthday7": 1596604455999999,
    "birthday8": 1596604455999999999
}
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",
    "birthday5": 1596604455,
    "birthday6": 1596604455999,
    "birthday7": 1596604455999999,
    "birthday8": 1596604455999999999
}`
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

fmt.Sprintf("%d", person.Birthday5) // 1596604455
fmt.Sprintf("%d", person.Birthday6) // 1596604455999
fmt.Sprintf("%d", person.Birthday7) // 1596604455999999
fmt.Sprintf("%d", person.Birthday8) // 1596604455999999999

更新日志

  • 新增 tag 结构体,优化 LoadTag 方法
  • encoding.go 文件中 MarshalJSON 方法新增对 U,V,X,Z 的解析
  • 优化 database.go 文件中的 Scan 方法,将默认时区设置为 Local
  • 优化 outputer.go 文件中 String 方法
  • CreateFromStdTime 方法新增 timezone 可选参数
  • 新增 India 时区常量
  • 提高性能测试覆盖率
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
Apache Synapse 远程代码执行漏洞(CVE
!(https://oscimg.oschina.net/oscnet/435fc4cde65d4aee9a2efca3080cb89e.png)0x00事件背景ApacheSynapse是一个简单、轻量级的高性能企业服务总线(ESB),它是在ApacheSoftwareFoun
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
普罗米修斯 普罗米修斯
2年前
go-dongle 0.2.5 版本发布,一个轻量级、语义化的 golang 编码解码、加密解密库
dongle是一个轻量级、语义化、对开发者友好的Golang编码解码和加密解密库