golang获取两个日期的自然天之差
jeason58 · · 5273 次点击 · · 开始浏览如题,在golang中要想获取两个时间相差的自然天数,比如 T1(2021年02月28日 23:59:59) 和 T2(2021年03月01日 00:00:00)这两个时间,尽管时间戳只相差1秒,但相差的自然天数为1,我期望的结果是1。但是go语言标准库中并没有提供计算日期差值的函数。
而网上大多数博客讲的都是用两个时间戳之差除一天的秒数(如:(T2.Unix()-T1.Unix()) / 86400),很明显这种方法只能计算出两个时间戳之差换算出的绝对天数,无法计算上面的T1和T2的自然天之差。
因此针对上述这种需求自己实现了一个函数用于获取两个时间的自然天之差,具体如下:
基本思路
首先判断两个日期t1和t2的绝对时间戳之差(diffSec)是否>86400(24小时);
- 如果 diffSec小于24小时,那么只需要比较t1和t2的日期是否相同,如果相同,则天数差为0,否则天数之差为1;
- 如果diffSec大于24小时,那么
diffSec/86400结果一定大于1(记为tmpDays,可得出t1与t2至少相差tmpDays的天数),然后给t1时间戳加上 tmpDays*86400,结果记为t11,此时t11与t2的时间戳之差小于24小时,就把问题转化为情况1了,此时只需判断t11与t2是否是同一天,如果是同一天,那么结果就是tmpDays,如果不是同一天,则结果为tmpDays+1;
代码实现
func diffNatureDays(t1, t2 int64) int {
if t1 == t2 {
return -1
}
if t1 > t2 {
t1, t2 = t2, t1
}
diffDays := 0
secDiff := t2 - t1
if secDiff > SecondsOfDay {
tmpDays := int(secDiff / SecondsOfDay)
t1 += int64(tmpDays) * SecondsOfDay
diffDays += tmpDays
}
st := time.Unix(t1, 0)
et := time.Unix(t2, 0)
dateFormatTpl := "20060102"
if st.Format(dateFormatTpl) != et.Format(dateFormatTpl) {
diffDays += 1
}
return diffDays
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
如题,在golang中要想获取两个时间相差的自然天数,比如 T1(2021年02月28日 23:59:59) 和 T2(2021年03月01日 00:00:00)这两个时间,尽管时间戳只相差1秒,但相差的自然天数为1,我期望的结果是1。但是go语言标准库中并没有提供计算日期差值的函数。
而网上大多数博客讲的都是用两个时间戳之差除一天的秒数(如:(T2.Unix()-T1.Unix()) / 86400),很明显这种方法只能计算出两个时间戳之差换算出的绝对天数,无法计算上面的T1和T2的自然天之差。
因此针对上述这种需求自己实现了一个函数用于获取两个时间的自然天之差,具体如下:
基本思路
首先判断两个日期t1和t2的绝对时间戳之差(diffSec)是否>86400(24小时);
- 如果 diffSec小于24小时,那么只需要比较t1和t2的日期是否相同,如果相同,则天数差为0,否则天数之差为1;
- 如果diffSec大于24小时,那么
diffSec/86400结果一定大于1(记为tmpDays,可得出t1与t2至少相差tmpDays的天数),然后给t1时间戳加上 tmpDays*86400,结果记为t11,此时t11与t2的时间戳之差小于24小时,就把问题转化为情况1了,此时只需判断t11与t2是否是同一天,如果是同一天,那么结果就是tmpDays,如果不是同一天,则结果为tmpDays+1;
代码实现
func diffNatureDays(t1, t2 int64) int {
if t1 == t2 {
return -1
}
if t1 > t2 {
t1, t2 = t2, t1
}
diffDays := 0
secDiff := t2 - t1
if secDiff > SecondsOfDay {
tmpDays := int(secDiff / SecondsOfDay)
t1 += int64(tmpDays) * SecondsOfDay
diffDays += tmpDays
}
st := time.Unix(t1, 0)
et := time.Unix(t2, 0)
dateFormatTpl := "20060102"
if st.Format(dateFormatTpl) != et.Format(dateFormatTpl) {
diffDays += 1
}
return diffDays
}