为什么我在golang的Date函数中得到错误的答案

前端之家收集整理的这篇文章主要介绍了为什么我在golang的Date函数中得到错误的答案前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在下面的代码中,

> 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))

猜你在找的Go相关文章