[英]How to parse 0000-00-00 00:00:00?
我正在从mysql数据库解析一些时间值,其中一些是零。 为什么Go无法解析这个问题,我该如何解决?
checkTime := "0000-00-00 00:00:00"
t, err := time.Parse("2006-01-02 15:04:05", checkTime)
if err !=nil{
log.Errorf("err %v, checkTime %v, ID %v", err, checkTime, bk.ID)
}
我明白了:
err parsing time "0000-00-00 00:00:00": month out of range, checkin 0000-00-00 00:00:00
这不解析,因为没有零年。 公元前1年是公元1年
对于大多数情况,对零年份进行特殊检查并在其位置存储NULL值可能是有意义的。
从实际的角度来看,公元1年至公元600年左右的任何日期都记录不清,可能是错误的。 在某处错过了几年。 学者们不确定有多少,但他们大多同意至少4年失踪,可能多达8或10年。也就是说,2015年实际应该是2019年至2029年。
首先是代码中的编译时错误:没有log.Errorf()
函数(即如果您使用的是标准log
包)。 而是使用例如log.Printf()
。
其次,正如您的错误所述: month out of range
。 月份在1..12
范围内。 月份值0
或00
无效。 在这里查看有效月份 。
零时间(或更精确的术语: time.Time
类型的零值 )如下所示:
log.Println("Zero time is:", time.Time{}.Format("2006-01-02 15:04:05"))
输出:
2009/11/10 23:00:00 Zero time is: 0001-01-01 00:00:00
请注意,年,月和日都是1
。
另请注意,即使天数从1
开始,第0
天也被接受,并被解释为从年份和月份部分指定的月份的第一天起的-1
天。
因此,虽然可以解析"0000-01-01 00:00:00"
并正确地给出"0000-01-01 00:00:00 +0000 UTC"
,但时间"0000-01-00 00:00:00"
将给出"-0001-12-31 00:00:00 +0000 UTC"
。
确切的日期"0000-00-00 00:00:00"
表示从来源中的零日(MySQL数据库?),因此,在进入检测到该日期时,我会为细末返回零值time.Time
所以你可以使用Time.IsZero()
方法从Go中检查它。 使用这个简单的帮助函数来解析你的时间:
func parseTime(s string) (time.Time, err) {
if s == "0000-00-00 00:00:00" {
return time.Time{}, nil
}
return time.Parse("2006-01-02 15:04:05", s)
}
请参阅Go Playground上的示例。
Time类型的零值是1月1日,第1年00:00:00.000000000 UTC 。 所以Go中没有0个月。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.