syf的开发笔记-4 go的时间获取

工作之后第一次过年回家就碰到了武汉肺炎这个事情

要在家办公很久 可能沟通效率会低一点

这次在家要待很久 也算对父母的一种补偿吧

毕竟大学我一共就有三个寒假在家 其他的假期不是在实习就是在训练

不过要不是有这些假期的准备 也没我现在的工作和好朋友吧

所以这大概也算因祸得福?

 

然后说说最近在家害改了一个有关时区的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时间

这样代码在哪里都可以跑 不管是容器还是服务器

然后就是要仔细了解函数的含义 不能主观臆断

最好直接看底层函数的注释 直接明了

上一篇:用datetime模块处理转换时区时间问题,而不是time模块


下一篇:MySQL5.7慢查询日志时间与系统时间差8小时原因