Warm tip: This article is reproduced from serverfault.com, please click

datetime-日期为Y = 0,M = 0,D = 0的日期解析为11月30日[今天]

(datetime - Date with Y=0, M=0, D=0 parsed to Nov 30 [Today])

发布于 2020-11-30 07:24:33

我有下面的程序来确定来自第三方的日期,在这种情况下,有时日期不合适,因此我想使比较失败,但由于某种原因,该日期总是被解析为今天,因此返回了肯定的响应。

import (
    "fmt"
    "time"
)

func main() {
    bday := time.Date(0, time.Month(0), 0, 0, 0, 0, 0, time.UTC)
    fmt.Print(bday)
}

来自main()的打印结果是:-0001-11-30 00:00:00 +0000 UTC

对我而言,DD和MM值已转换为今天,因为我正在使用此代码段检查用户的生日。

Questioner
User3
Viewed
11
icza 2020-11-30 16:45:18

前言:这个问题是在11月30日提出的,这就是为什么月份和日期部分看起来像今天这样。


正确解析了零值,但是没有“月0”。第一个月是一月,具有数字值1同样,也没有一个月的第0天,每个月的第一天是1

time.Date 证明以下内容的文件:

月,日,小时,分钟,秒和nsec值可能超出其通常范围,并且将在转换过程中进行归一化。例如,10月32日转换为11月1日。

因此,如果你传递0月份和日期,则解释与传递1月份和日期相同,并相加-1

请参阅以下示例:

bday := time.Date(0, time.Month(0), 0, 0, 0, 0, 0, time.UTC)
fmt.Println(bday)

bday2 := time.Date(0, time.Month(1), 1, 0, 0, 0, 0, time.UTC)
fmt.Println(bday2)
bday2 = bday2.AddDate(0, -1, -1)
fmt.Println(bday2)

哪些输出(在Go Playground上尝试):

-0001-11-30 00:00:00 +0000 UTC
0000-01-01 00:00:00 +0000 UTC
-0001-11-30 00:00:00 +0000 UTC

因此,结果变成“今天”纯属偶然,今天是11月30日。如果明天运行代码,则月日部分将不再是今天,而是昨天。