2016-04-07 38 views
12

在下面的代碼,爲什麼我收到的日期功能錯誤的答案在golang

  • T1是時間第62天日期1970/1/1(YY/MM/DD)
  • T2後是時間63天日期1970/1/1(YY/MM/DD)後

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 

    t1 := time.Date(0, 0, 62, 0, 0, 0, 0, time.UTC).AddDate(1970, 1, 1) 
    t2 := time.Date(0, 0, 63, 0, 0, 0, 0, time.UTC).AddDate(1970, 1, 1) 

    fmt.Println("Time1: ", t1) 
    fmt.Println("Time2: ", t2) 
} 

如果t1爲:

Time1: 1970-03-04 00:00:00 +0000 UTC 

我希望T2是:

Time2: 1970-03-05 00:00:00 +0000 UTC 

但輸出是:

Time2: 1970-03-02 00:00:00 +0000 UTC 

,這是什麼原因呢?

回答

11

t1爲時間上62天日期1970/1/1(YY/MM/DD)t2爲時間上的日期後63天1970/1/1(YY/MM/DD)

這是不正確的。 t1是1970年,1個月和1天后的時間,不管time.Date(0, 0, 62, 0, 0, 0, 0, time.UTC)的意思。

fmt.Println(time.Date(0, 0, 62, 0, 0, 0, 0, time.UTC)) 
fmt.Println(time.Date(0, 0, 63, 0, 0, 0, 0, time.UTC)) 

給我們:

0000-01-31 00:00:00 +0000 UTC 
0000-02-01 00:00:00 +0000 UTC 

這是完全錯誤的。 UTC在1972年以前的任何日期都沒有定義,公曆從1582年開始並且從未有過任何年份0.忽略所有這些,我不明白一年中的63天可以被解釋爲1月31日,但無論如何,我們還是一起去吧。

讓我們把東西添加到第一個時間戳:添加1970年,我們得到1970-01-31。加一個月,我們得到1970-02-31。但1970-02-31不是有效的日期。所以它已經正常化到3月3日。 1970年不是閏年,2月有28天,所以2月29日是3月1日,2月30日是3月2日,2月31日是3月3日。加上一天到1970-03-03,我們得到1970-03-04。

第二個時間戳已經解析到2月1日。增加一個月,我們得到3月1日,增加一天,我們得到3月2日。

這是當您爲時間戳添加幾個月時發生的情況。一個月的時間不是很明確。因此,圖書館試圖對你很聰明,這會讓你意想不到的結果。

Btw。出於某種原因:fmt.Println(time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC))被解釋爲​​。不知道爲什麼。自0年和0月不存在以來無關緊要。但它解釋了爲什麼早期的時間戳在1月31日和2月1日結束。

AddDate沒有理由按此順序添加東西。據我所知,沒有記錄。它也可以先增加一天,然後再增加一個月,然後再增加幾年。嘗試運行此操作:

fmt.Println(time.Date(2015, 1, 31, 0, 0, 0, 0, time.UTC).AddDate(1, 0, 0).AddDate(0, 1, 0)) 
fmt.Println(time.Date(2015, 1, 31, 0, 0, 0, 0, time.UTC).AddDate(0, 1, 0).AddDate(1, 0, 0)) 
相關問題