我有下面的程序来确定来自第三方的日期,在这种情况下,有时日期不合适,因此我想使比较失败,但由于某种原因,该日期总是被解析为今天,因此返回了肯定的响应。
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值已转换为今天,因为我正在使用此代码段检查用户的生日。
前言:这个问题是在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日。如果明天运行代码,则月日部分将不再是今天,而是昨天。
只是巧合,我认为,作为一种变通办法,我必须将操作包装在if条件内。