为了账号安全,请及时绑定邮箱和手机立即绑定

Y=0、M=0、D=0 的日期解析为 11 月 30 日

Y=0、M=0、D=0 的日期解析为 11 月 30 日

Go
蝴蝶不菲 2022-07-18 09:59:24
我有以下程序来确定来自第三方的日期,在这种情况下,有时日期不正确,我想使比较失败,但不知何故,日期总是被解析到今天,这会返回一个积极的响应。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 值,因为我用这个片段来检查用户的生日。
查看完整描述

1 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

前言:这个问题是在 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 日。如果你明天运行代码,月日部分将不再是今天,而是昨天。


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信