【Golang】GoFrame/gtime 模块使用踩坑小结

背景:  

  最近接手了前同事的一个项目,项目交接后前辈提交了一些积压在自己分支的代码,并做了一次线上发布。版本发布后用户反馈,数据统计分析模块时间怎么是 2006-01-02 ?针对用户的报障,我这边首先做了线上回滚,接着开始了排障之旅...

排障思路:  

2006-01-02 这个时间格式对于使用 Go 的同学是不陌生的,此处事出反常必有妖...

1,查看项目代码, XXDate.Format("2006-01-02") ,按照通常使用的 Golang/time 的时间格式化方式,在 XXDate 数据正常的情况下是不会出现问题的;

2,查看 XXDate 的类型,定义的是 gtime.Time 而非 time.Time,查看 gtime.Time 的定义,从定义上看类型是没有问题的;

1 // Time is a wrapper for time.Time for additional features.
2 type Time struct {
3     wrapper
4 }
1 // wrapper is a wrapper for stdlib struct time.Time.
2 // It's used for overwriting some functions of time.Time, for example: String.
3 type wrapper struct {
4     time.Time
5 }

3,开启 Debug 模式,打印出 XXDate 的值  2020-12-01 00:00:00 ,验证了 2 中的值确实没有问题;

4,那问题就应该出现在  .Format  方法上,查看 gtime.Format 方法源码发现确实与 time.Format 不一样 🤔,而 gtime 的 Layout 方法才是对标准库 Format 的封装:

1 // Layout formats the time with stdlib layout and returns the formatted result.
2 func (t *Time) Layout(layout string) string {
3     if t == nil {
4         return ""
5     }
6     return t.Time.Format(layout)
7 }

同时,参照 gtime 文档 可以看到两者的一个使用说明:

 

  

解决方式: 

由文档及源码可以看到,gtime.Format 是不支持 "2006-01-02" 这种格式化的,可以使用 .Layout("2006-01-02") 或者 .Format("Y-m-d") 这种方式替代。

同时,也给项目封装了通用的时间格式化方法,并添加了详细的代码注释,全量替换掉原项目内 gtime 错误的时间格式化方式,并完成测试后发布上线。

小结:

项目中框架和各种库的引入,在带来便利的同时也会带来一定的学习成本,在使用引入库的方法时还是要认真看文档,严格遵循文档进行开发,尽量避免自己“想当然”的一种写法。虽然是个小小的问题,也值得自己学习很多,共勉搬砖人!

 


 

posted @ 2021-04-11 16:25  winlily  阅读(544)  评论(0编辑  收藏  举报