加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 19:22:51 所属栏目:大数据 来源:网络整理
导读:在下面的代码中, t1是1970/1/1之后62天的时间(yy / mm / dd) t2是1970/1/1之后63天的时间(yy / mm / dd) package mainimport ( "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是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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读