工作之后第一次过年回家就碰到了武汉肺炎这个事情
要在家办公很久 可能沟通效率会低一点
这次在家要待很久 也算对父母的一种补偿吧
毕竟大学我一共就有三个寒假在家 其他的假期不是在实习就是在训练
不过要不是有这些假期的准备 也没我现在的工作和好朋友吧
所以这大概也算因祸得福?
然后说说最近在家害改了一个有关时区的bug
因为最近写了一个日报邮件的功能
在每天凌晨五点给订阅人发送前一天的项目任务的标注情况
第一步显然就是获取前一天的日期
因为系统是部署在k8s容器里的
所以容器里直接取time.Now()是UTC时间 不是北京时间
所以第一版获取前一天的函数我是这么写的
func GetYesterday() (time.Time, time.Time) { PRCTime, _ := time.LoadLocation("Asia/Shanghai") year, month, day := time.Unix(time.Now().UTC().In(PRCTime).Add(-24*time.Hour).Unix(), 0).Date() yesterdayStart := time.Date(year, month, day, 0, 0, 0, 0, PRCTime) yesterdayEndTime := time.Date(year, month, day, 23, 59, 59, 0, PRCTime) return yesterdayStart, yesterdayEndTime }
最早的第一版time.Now()的.UTC()我都没写
后来经过朝滨提醒 知道这还是要加个UTC的
毕竟UTC才是时间的标准
但是这么写每天获取前一天的时间还是不对
然后查了一下发现这个Date函数这么好像不太对
好像这么用是UTC时间的那个时间 在time.Local是多少
显然这个功能不是我想要的
应该是获取这个时间北京时间的时间戳
google了一些博客之后发现用time.ParseInLocation()这个函数才对
所以最终版是这个样子的
func GetYesterday() (time.Time, time.Time) { PRCTime, _ := time.LoadLocation("Asia/Shanghai") timeStr := time.Now().Format("2006-01-02") yesterdayStart, _ := time.ParseInLocation("2006-01-02", timeStr, PRCTime) yesterdayEndTime, _ := time.ParseInLocation("2006-01-02 15:04:05", timeStr+" 23:59:59", PRCTime) return yesterdayStart, yesterdayEndTime }
总结一下
在使用时间的时候一定要先转城UTC时间
这样代码在哪里都可以跑 不管是容器还是服务器
然后就是要仔细了解函数的含义 不能主观臆断
最好直接看底层函数的注释 直接明了