> t1是1970/1/1之后62天的时间(yy / mm / dd)
> t2是1970/1/1之后63天的时间(yy / mm / dd)
package main import ( "fmt" "time" ) func main() { t1 := time.Date(0,62,time.UTC).AddDate(1970,1,1) t2 := time.Date(0,63,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
这是什么原因?
t1 is time on 62 days after the date 1970/1/1 (yy/mm/dd) t2 is time on 63 days after the date 1970/1/1 (yy/mm/dd)
这不是真的. t1是1970年,1个月和1天之后的时间.日期(0,time.UTC)是指.
fmt.Println(time.Date(0,time.UTC)) fmt.Println(time.Date(0,time.UTC))
给我们:
0000-01-31 00:00:00 +0000 UTC 0000-02-01 00:00:00 +0000 UTC
这是完全错误的. UTC在1972年之前的任何日期都没有定义,公历不会在1582年之前开始,从来没有任何一年.忽略所有这一切,我看不出每年的第63天可以解释为1月31日,但是我们一起去吧.
让我们把事情添加到第一个时间戳:add 1970,我们得到了1970-01-31.加一个月,我们得到了1970-02-31.但是1970-02-31不是有效的日期.所以正常化到3月3日. 1970年不是闰年,二月有28天,所以2月29日是3月1日,2月30日是3月2日,3月3日是3月3日.在1970-03-03加一天到1970-03-04.
第二个时间戳已经解析到2月1日.添加一个月,我们到3月1日,添加一天,我们得到3月2日.
当您添加时间戳的月份时,会发生什么.一个月不是一个非常明确的持续时间.所以图书馆试图为你聪明,这让你意想不到的结果.
顺便说一句.由于某些原因:fmt.Println(time.Date(0,time.UTC))被解释为-0001-11-30 00:00:00 0000 UTC.不知道为什么从0年开始并不重要,0个月不存在.但它解释了为什么早期的时间戳在1月31日和2月1日.
AddDate没有理由按此顺序添加东西.据我所知,没有记录.也可以先添加一天,然后再增加一个月,然后是这几年.尝试运行这个:
fmt.Println(time.Date(2015,31,time.UTC).AddDate(1,0).AddDate(0,0)) fmt.Println(time.Date(2015,time.UTC).AddDate(0,0).AddDate(1,0))