gpt4 book ai didi

go - 为什么我在 golang 的日期函数中得到错误的答案

转载 作者:IT老高 更新时间:2023-10-28 13:07:25 26 4
gpt4 key购买 nike

在下面的代码中,

  • t1 是日期 1970/1/1 (yy/mm/dd) 后 62 天的时间
  • t2 是日期 1970/1/1 (yy/mm/dd) 后 63 天的时间

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

这是什么原因?

最佳答案

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)

这不是真的。 t1time.Date(0, 0, 62, 0, 0, 0, 0, time.UTC) 之后的 1970 年 1 个月零 1 天意思。

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 日。

当您在时间戳中添加月份时会发生这种情况。一个月不是一个很好定义的持续时间。所以图书馆试图为你聪明,这会给你带来意想不到的结果。

顺便说一句。出于某种原因: fmt.Println(time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC)) 被解释为 -0001-11-30 00:00:00 +0000 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))

关于go - 为什么我在 golang 的日期函数中得到错误的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36473385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com