首页 > 解决方案 > Y=0、M=0、D=0 的日期解析为 11 月 30 日 [今天]

问题描述

我有以下程序来确定来自第三方的日期,在这种情况下,有时日期不正确,我想使比较失败,但不知何故,日期总是被解析到今天,这会返回一个肯定的响应。

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 值,因为我用这个片段来检查用户的生日。

标签: datetimegotime

解决方案


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


零值被正确解析,但没有“月 0”。第一个月是具有数值的一月1。同理,一个月没有第 0 天,每个月的第一天都是1.

time.Date文件表明:

月、日、小时、分钟、秒和纳秒值可能超出其通常范围,并且将在转换过程中进行标准化。例如,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 日。如果你明天运行代码,月日部分将不再是今天,而是昨天。


推荐阅读