Go-json解析时间格式
需要自己实现 MarshalJSON
和UnmarshalJSON
方法,如果只需要存或者取,实现一个也可
type Date struct {
time.Time
}
func (d *Date) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf(`"%s"`, d.Format("2006-01-02"))), nil
}
func (d *Date) UnmarshalJSON(b []byte) error {
var err error
// 指定时区
d.Time, err = time.ParseInLocation(`"2006-01-02"`, string(b),time.Local)
if err != nil {
return err
}
return nil
}
type Datetime struct {
time.Time
}
func (d *Datetime) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf("%s", d.Format("2006-01-02 15:04:05"))), nil
}
func (d *Datetime) UnmarshalJSON(b []byte) error {
var err error
d.Time, err = time.Parse(`"2006-01-02 15:04:05"`, string(b))
if err != nil {
return err
}
return nil
}
测试
type Amazing struct {
D Date `json:"data"`
}
func main() {
demo := &Amazing{}
_ = json.Unmarshal([]byte(`{"data":"2021-03-30"}`), demo)
fmt.Println(demo) // &{2021-03-30 00:00:00 +0800 CST}
demo2 := &Amazing{D: Date{time.Now()}}
v, _ := json.Marshal(demo2)
fmt.Println(string(v)) // {"data":"2021-03-30"}
}
进阶,配合gorm
type Date time.Time
func (d *Date) Scan(value interface{}) (err error) {
nullTime := &sql.NullTime{}
err = nullTime.Scan(value)
*d = Date(nullTime.Time)
return
}
func (d Date) Value() (driver.Value, error) {
y, m, dd := time.Time(d).Date()
// time.Local 本地时区,如果使用 time.time(d).Location() 有可能为空切换到UTC时区
return time.Date(y, m, dd, 0, 0, 0, 0, time.Local), nil
}
// GormDataType gorm common data type
func (d Date) GormDataType() string {
return "date"
}
func (d *Date) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf(`"%s"`, (*time.Time)(d).Format("2006-01-02"))), nil
}
func (d *Date) UnmarshalJSON(b []byte) error {
dd, err := time.ParseInLocation(`"2006-01-02"`, string(b), time.Local)
if err != nil {
return err
}
*d = Date(dd)
return nil
}
type Datetime time.Time
func (d *Datetime) Scan(value interface{}) (err error) {
nullTime := &sql.NullTime{}
err = nullTime.Scan(value)
*d = Datetime(nullTime.Time)
return
}
func (d Datetime) Value() (driver.Value, error) {
y, m, dd := time.Time(d).Date()
return time.Date(y, m, dd, 0, 0, 0, 0, time.Time(d).Location()), nil
}
func (d *Datetime) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf("%s", (*time.Time)(d).Format(`"2006-01-02 15:04:05"`))), nil
}
func (d *Datetime) UnmarshalJSON(b []byte) error {
dd, err := time.ParseInLocation(`"2006-01-02 15:04:05"`, string(b), time.Local)
if err != nil {
return err
}
*d = Datetime(dd)
return nil
}
// GormDataType gorm common data type
func (d Datetime) GormDataType() string {
return "datetime"
}
Songzhibin
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
2020-03-30 Go竞争条件检测