自定义一个类型实现go时间类型的json和bson的序列化和反序列化

  • 需求
  • 实现 -自定义JSONTime类型
  • 如何使用?

需求

go语言在时间 和 json 转换时使用 yyyy-MM-dd HH:mm:ss 的格式,存到mongo时使用 时间戳(秒) 保存

实现 -自定义JSONTime类型

package JSONTimeimport ("go.mongodb.org/mongo-driver/bson/bsontype""go.mongodb.org/mongo-driver/x/bsonx/bsoncore""time"
)const (YYYYMMDD          = "2006-01-02"DefaultTimeFormat = "2006-01-02 15:04:05"
)// 自定义 类型
type JSONTime struct {Time time.Time
}//实现 json 的反序列方法
func (t *JSONTime) UnmarshalJSON(data []byte) (err error) {now, err := time.ParseInLocation(`"`+DefaultTimeFormat+`"`, string(data), time.Local)t.Time = nowreturn
}// 实现 json 的序列化方法
func (t JSONTime) MarshalJSON() ([]byte, error) {b := make([]byte, 0, len(DefaultTimeFormat)+2)b = append(b, '"')b = t.Time.AppendFormat(b, DefaultTimeFormat)b = append(b, '"')return b, nil
}//初始化时间戳 2006-01-02 15:04:01
const INIT_TIMESTAMPT = 1136185440 //实现 bson 的 序列化方法
func (t *JSONTime) MarshalBSONValue() (bsontype.Type, []byte, error) {timestampt := t.Time.Unix()if timestampt < 0 {timestampt = INIT_TIMESTAMPT}retByte := make([]byte, 0)retByte = bsoncore.AppendInt64(retByte, timestampt)return bsontype.Int64, retByte, nil
}//实现 bson 的 反序列化方法
func (t *JSONTime) UnmarshalBSONValue(ty bsontype.Type, data []byte) error {if ty == bsontype.Int64 {if readInt64, _, ok := bsoncore.ReadInt64(data); ok {t.Time = time.Unix(readInt64, 0)}}return nil
}

如何使用?

type User struct {......CreatedAt JSONTime.JSONTime  `json:"created_at" bson:"created_at"`......
}

自定义一个类型实现go时间类型的json和bson的序列化和反序列化相关推荐

  1. MySQL 基础 -- MySQL 数据类型说明(数值类型、字符串类型、日期时间类型)、SQL通用语法和SQL分类

    文章目录 1. 数据类型说明(数值类型.字符串类型.日期时间类型) 1.1数值类型 1.2 字符串类型 1.3 日期类型 1.4 数据类型练习:设计一张员工信息表 2. SQL通用语法和SQL分类 2 ...

  2. mysql时长用什么类型_MySQL 日期时间类型怎么选?千万不要乱用!

    构建数据库写程序避免不了使用日期和时间,对于数据库来说,有多种日期时间字段可供选择,如 timestamp 和 datetime 以及使用 int 来存储 unix timestamp. 不仅新手,包 ...

  3. mysql 时间类型转化_Mysql 字段类型转化 和 时间类型相关处理

    I) 字段类型转化 MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值.两者具体的语法如下: CAST(value as type); CONVERT(va ...

  4. mysql中将长整型转换为时间类型或将时间类型转换为长整型

    长整型转换为时间类型的关键字:FROM_UNIXTIME(长整型,format): 时间类型转换为长整型的关键字:UNIX_TIMESTAMP(时间类型): 长整型转换为时间类型例子:select F ...

  5. 如何打印time_t时间类型? time_t时间类型详解

    linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的. time_t 这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确 ...

  6. MySQL 学习笔记(12)— 数据类型(定长字符、变长字符、字符串大对象、数字类型、日期时间类型、二进制类型)

    MySQL 常见的数据类型有字符串类型.数字类型.时间类型.二进制类型.具体的分类如下图: 1. 字符串类型 字符串类型用于存储字符和字符串数据,主要包含三种具体的类型:定长字符串.变长字符串以及字符 ...

  7. pandas 如何把时间转成index_pandas将字段中的字符类型转化为时间类型,并设置为索引...

    假设目前已经引入了 pandas,同时也拥有 pandas 的 DataFrame 类型数据. import pandas as pd 数据集如下 df.head(3) date open close ...

  8. golang时间类型字符串转时间类型

    const Layout = "2006-01-02 15:04:05"//时间常量 loc, _ := time.LoadLocation("Asia/Shanghai ...

  9. Android自定义一个属于自己的时间钟表

    1.概述 本文主要讲解的是如何自定义一个时间钟表,通过简单的练习可以简单学习android当中自定义view的一些常用绘图技巧,优化android绘图操作.言归正传,首先看下我们需要实现的效果: 当我 ...

最新文章

  1. HTML5学习笔记(三):HTML5的智能提示在VisualStudio2010
  2. 小议H.264技术发展趋势
  3. 思科模拟服务器怎么写文件,思科模拟服务器配置教程
  4. LeetCode 900. RLE 迭代器(模拟/二分查找)
  5. input type类型_设备树下的input子系统
  6. ***经验谈之SA权限***的感悟
  7. yolo系列外文翻译_Yolo系列其三:Yolo_v3
  8. 前端工具类项目规范化-使用TS
  9. [Android Pro] 关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法...
  10. windows 下安装 sns 学习研究
  11. 【英文学术论文写作 | 笔记】第一讲 学术研究与英文学术论文写作概述
  12. 电影TS/TC/SCR/R5/BD/HD/HC版本意思收集(转)
  13. 自己动手编译NodeMCU固件
  14. python内turtle库应用
  15. 如何查看电脑的上一次开机时间
  16. Python爬虫进阶之字体反扒保姆级教程!
  17. 影视寒冬,但却可能是广告主营销的机遇
  18. AAAI 2020 提前看 | 三篇论文解读问答系统最新研究进展
  19. 【后缀自动机】Luogu P3975 [TJOI2015]弦论题解
  20. 京东面经!让你的春招不再迷茫!

热门文章

  1. 【6S管理操作手册】
  2. 拼音首字符序列来实现检索功能
  3. Coordinate坐标
  4. ADS学习:原理图和layout协同仿真
  5. 【网络】虚拟专用网络工作在哪一层?
  6. 如何压缩 Microsoft Virtual PC 2007 虚拟硬盘文件(.VHD文件)
  7. Windows Virtual PC如何瘦身~
  8. 不懂智能投顾?看这一篇就足够了
  9. x86 - CPU架构/寄存器详解 (三) 保护模式
  10. Tensorflow 模型保存与恢复(2)使用SavedModel