GO语言程序中解决中文日期格式的解析问题

最近做一个使用gin框架的GO语言项目,需要将前端传递过来的中文日期格式的字符串转换成GO语言的时间类型,遇到了`parsing time xx as xx: cannot parse xx as xx` 这样的错误,原来这是GO语言特殊的时间格式引起的,它默认不是使用系统的时间格式,使用的时候需要进行转换。下面做一个笔记记录解决方法。

package util

import (
     "fmt"
    "time"
)

const (
    DateFormat = "2006-01-02"
    TimeFormat = "2006-01-02 15:04:05"
)

//add by dengtaihua 2021-08-15
//DateTime 中文格式处理,例如 "2021-08-15"
type Date time.Time

func (d Date) MarshalJSON() ([]byteerror) {
    return []byte(fmt.Sprintf(`"%s"`, time.Time(d).Format(DateFormat))), nil
}

func (d *Date) UnmarshalJSON(b []byteerror {
    nowerr := time.ParseInLocation(`"`+DateFormat+`"`string(b), time.Local)
    if err != nil {
        return fmt.Errorf("can not convert %v to date,must like format:yyyy-MM-dd,simple example : %v"string(b), DateFormat)
    }
    *d = Date(now)
    return nil
}

func (d Date) Value() (driver.Value, error) {
    var zeroTime time.Time
    if time.Time(d).UnixNano() == zeroTime.UnixNano() {
        return nilnil
    }
    return time.Time(d), nil
}

func (d *Date) Scan(v interface{}) error {
    valueok := v.(time.Time)
    if ok {
        *d = Date(value)
        return nil
    }
    return fmt.Errorf("can not convert %v to timestamp", v)
}

func (d Date) String() string {
    return time.Time(d).Format(DateFormat)
}

//add by dengtaihua 2021-08-15
//DateTime 中文格式处理,例如 "2021-08-15 10:21:00"
type DateTime time.Time

func (t DateTime) MarshalJSON() ([]byteerror) {
    return []byte(fmt.Sprintf(`"%s"`, time.Time(t).Format(TimeFormat))), nil
}

func (t *DateTime) UnmarshalJSON(b []byteerror {
    nowerr := time.ParseInLocation(`"`+TimeFormat+`"`string(b), time.Local)
    if err != nil {
        return fmt.Errorf("can not convert %v to date,must like format:yyyy-MM-dd HH:mm:ss,simple example : %v"string(b), TimeFormat)
    }
    *t = DateTime(now)
    return nil
}

func (t DateTime) Value() (driver.Value, error) {
    var zeroTime time.Time
    if time.Time(t).UnixNano() == zeroTime.UnixNano() {
        return nilnil
    }
    return time.Time(t), nil
}

func (t *DateTime) Scan(v interface{}) error {
    valueok := v.(time.Time)
    if ok {
        *t = DateTime(value)
        return nil
    }
    return fmt.Errorf("can not convert %v to timestamp", v)
}

func (t DateTime) String() string {
    return time.Time(t).Format(TimeFormat)
}

使用示例:

// 修改请假入参
type UpdateLeaveParam struct {
	Id         uint      `json:"id"`         // 请假记录ID
	ContactId  uint      `json:"contactId"`  // 宝宝请假的联系人
	OperatorId uint      `json:"operatorId"` // 请假操作人
	Device     string    `json:"device"`     // 请假操作使用的设备:PC/PAD/手机
	LeaveDate  util.Date `json:"date"`       // 请假时间
	LeaveType  int       `json:"leaveType"`  // 请假类型:病假/事假
	Reason     string    `json:"reason"`     // 请假原因
}

 

GO语言程序中解决中文日期格式的解析问题

上一篇:装饰器实现JWT校验认证


下一篇:KMP 算法的 JS 实现