golang获取两个日期的自然天之差


本文摘自网络,作者,侵删。

如题,在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小时);

  1. 如果 diffSec小于24小时,那么只需要比较t1和t2的日期是否相同,如果相同,则天数差为0,否则天数之差为1;
  2. 如果diffSec大于24小时,那么diffSec/86400结果一定大于1(记为tmpDays,可得出t1与t2至少相差tmpDays的天数),然后给t1时间戳加上 tmpDays*86400,结果记为t11 ,此时t11t2的时间戳之差小于24小时,就把问题转化为情况1了,此时只需判断t11t2是否是同一天,如果是同一天,那么结果就是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
}

本文来自:简书

感谢作者:jeason58

查看原文:golang获取两个日期的自然天之差

相关阅读 >>

模块二 Go语言进阶技术-错误处理(下)

Golang channel是什么

Golang读锁有什么用

Go语言从入门到实战,带你拿下Golang的高效编程法

Go协程全局变量和局部变量

手撸Golang 基本数据结构与算法 归并排序

Go错误处理

数组指针做函数参数

Golang中的map是指针吗

关于Golang panic用法详解

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...