如题,在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
}
有疑问加站长微信联系(非本文作者)