golang 獲取AB兩個日期相差多少天

今天碰到了要求兩個日期間相差多少天,兩個不同日期的嗜桌,相差一秒都算一天.
標準庫中沒有相應的實現(xiàn),自己寫了個.

func timeSubDays(t1, t2 time.Time) int {

    if t1.Location().String() != t2.Location().String() {
        return -1
    }
    hours := t1.Sub(t2).Hours()

    if hours <= 0 {
        return -1
    }
    // sub hours less than 24
    if hours < 24 {
        // may same day
        t1y, t1m, t1d := t1.Date()
        t2y, t2m, t2d := t2.Date()
        isSameDay := (t1y == t2y && t1m == t2m && t1d == t2d)

        if isSameDay {

            return 0
        } else {
            return 1
        }

    } else { // equal or more than 24

        if (hours/24)-float64(int(hours/24)) == 0 { // just 24's times
            return int(hours / 24)
        } else { // more than 24 hours
            return int(hours/24) + 1
        }
    }

}

test,直接在main中寫的

layout := "2006-01-02 15:04:05"

    // just one second
    t1, _ := time.Parse(layout, "2007-01-02 23:59:59")
    t2, _ := time.Parse(layout, "2007-01-03 00:00:00")
    if timeSub(t2, t1) != 1 {
        panic("one second but different day should return 1")
    }

    // just one day
    t1, _ = time.Parse(layout, "2007-01-02 23:59:59")
    t2, _ = time.Parse(layout, "2007-01-03 23:59:59")
    if timeSub(t2, t1) != 1 {
        panic("just one day should return 1")
    }

    // more than one day
    t1, _ = time.Parse(layout, "2007-01-02 23:59:59")
    t2, _ = time.Parse(layout, "2007-01-04 00:00:00")
    if timeSub(t2, t1) != 2 {
        panic("just one day should return 2")
    }
    // just 3 day
    t1, _ = time.Parse(layout, "2007-01-02 00:00:00")
    t2, _ = time.Parse(layout, "2007-01-05 00:00:00")
    if timeSub(t2, t1) != 3 {
        panic("just 3 day should return 3")
    }

    // different month
    t1, _ = time.Parse(layout, "2007-01-02 00:00:00")
    t2, _ = time.Parse(layout, "2007-02-02 00:00:00")
    if timeSub(t2, t1) != 31 {
        fmt.Println(timeSub(t2, t1))
        panic("just one month:31 days should return 31")
    }

    // 29 days in 2mth
    t1, _ = time.Parse(layout, "2000-02-01 00:00:00")
    t2, _ = time.Parse(layout, "2000-03-01 00:00:00")
    if timeSub(t2, t1) != 29 {
        fmt.Println(timeSub(t2, t1))
        panic("just one month:29 days should return 29")
    }

更正修訂


經(jīng)2樓空靈一月指出奥溺,上面的代碼有邏輯錯誤,而且寫的時候是參照另外一個人代碼寫的」浅瑁現(xiàn)用time.Truncate 和 Time.Sub來做浮定,測試追加2樓的case,如下:

package test

import (
    "fmt"
    "testing"
    "time"
)

func timeSub(t1, t2 time.Time) int {
    t1 = t1.UTC().Truncate(24 * time.Hour)
    t2 = t2.UTC().Truncate(24 * time.Hour)
    return int(t1.Sub(t2).Hours() / 24)
}

func TestTime(t *testing.T) {
    layout := "2006-01-02 15:04:05"

    // just one second
    t1, _ := time.Parse(layout, "2007-01-02 23:59:59")
    t2, _ := time.Parse(layout, "2007-01-03 00:00:00")
    if timeSub(t2, t1) != 1 {
        panic("one second but different day should return 1")
    }

    // just one day
    t1, _ = time.Parse(layout, "2007-01-02 23:59:59")
    t2, _ = time.Parse(layout, "2007-01-03 23:59:59")
    if timeSub(t2, t1) != 1 {
        panic("just one day should return 1")
    }

    t1, _ = time.Parse(layout, "2017-09-01 10:00:00")
    t2, _ = time.Parse(layout, "2017-09-02 11:00:00")
    if timeSub(t2, t1) != 1 {
        panic("just one day should return 1")
    }

    // more than one day
    t1, _ = time.Parse(layout, "2007-01-02 23:59:59")
    t2, _ = time.Parse(layout, "2007-01-04 00:00:00")
    if timeSub(t2, t1) != 2 {
        panic("just one day should return 2")
    }
    // just 3 day
    t1, _ = time.Parse(layout, "2007-01-02 00:00:00")
    t2, _ = time.Parse(layout, "2007-01-05 00:00:00")
    if timeSub(t2, t1) != 3 {
        panic("just 3 day should return 3")
    }

    // different month
    t1, _ = time.Parse(layout, "2007-01-02 00:00:00")
    t2, _ = time.Parse(layout, "2007-02-02 00:00:00")
    if timeSub(t2, t1) != 31 {
        fmt.Println(timeSub(t2, t1))
        panic("just one month:31 days should return 31")
    }

    // 29 days in 2mth
    t1, _ = time.Parse(layout, "2000-02-01 00:00:00")
    t2, _ = time.Parse(layout, "2000-03-01 00:00:00")
    if timeSub(t2, t1) != 29 {
        fmt.Println(timeSub(t2, t1))
        panic("just one month:29 days should return 29")
    }
}

再次更正修訂
frfluter 指出個bug层亿,Truncate方法用的是絕對時間桦卒,如果給出的時間為本地時間,會存在時區(qū)匿又,會出現(xiàn)不同時間化為同一天的情況

func timeSub(t1, t2 time.Time) int {
    t1 = time.Date(t1.Year(), t1.Month(), t1.Day(), 0, 0, 0, 0, time.Local)
    t2 = time.Date(t2.Year(), t2.Month(), t2.Day(), 0, 0, 0, 0, time.Local)

    return int(t1.Sub(t2).Hours() / 24)
}

新增測試case:
    t1 = time.Date(2018, 1, 10, 0, 0, 1, 100, time.Local)
    t2 = time.Date(2018, 1, 9, 23, 59, 22, 100, time.Local)
    if timeSub(t1, t2) != 1 {
        panic(fmt.Sprintf("just one day: should return 1 but got %v", timeSub(t1, t2)))
    }

    t1 = time.Date(2018, 1, 10, 0, 0, 1, 100, time.UTC)
    t2 = time.Date(2018, 1, 9, 23, 59, 22, 100, time.UTC)
    if timeSub(t1, t2) != 1 {
        panic(fmt.Sprintf("just one day: should return 1 but got %v", timeSub(t1, t2)))
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末方灾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裕偿,老刑警劉巖洞慎,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘿棘,居然都是意外死亡劲腿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門鸟妙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焦人,“玉大人,你說我怎么就攤上這事重父±疲” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵坪郭,是天一觀的道長个从。 經(jīng)常有香客問我,道長歪沃,這世上最難降的妖魔是什么嗦锐? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮沪曙,結果婚禮上奕污,老公的妹妹穿的比我還像新娘。我一直安慰自己液走,他們只是感情好碳默,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缘眶,像睡著了一般嘱根。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巷懈,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天该抒,我揣著相機與錄音,去河邊找鬼顶燕。 笑死凑保,一個胖子當著我的面吹牛,可吹牛的內容都是我干的涌攻。 我是一名探鬼主播欧引,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恳谎!你這毒婦竟也來了芝此?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎癌蓖,沒想到半個月后瞬哼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡租副,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年坐慰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片用僧。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡结胀,死狀恐怖,靈堂內的尸體忽然破棺而出责循,到底是詐尸還是另有隱情糟港,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布院仿,位于F島的核電站秸抚,受9級特大地震影響,放射性物質發(fā)生泄漏歹垫。R本人自食惡果不足惜剥汤,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望排惨。 院中可真熱鬧吭敢,春花似錦、人聲如沸暮芭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辕宏。三九已至畜晰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匾效,已是汗流浹背舷蟀。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留面哼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓扫步,卻偏偏與公主長得像魔策,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子河胎,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容