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

jeason58 · · 4431 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

如题,在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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4431 次点击  
加入收藏 微博
1 回复  |  直到 2021-03-03 17:30:33
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传