我正在从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
答案 0 :(得分:5)
那不解析,因为没有零年。在公元前1点之后是1 A.D。
对于大多数情境,对零年进行特殊检查并在其位置存储NULL值可能是有意义的。
从实际角度来看,公元1年至公元600年左右的任何日期记录都很少,可能是错误的。在某处错过了几年。学者们不确定有多少,但他们大多同意至少4年失踪,可能多达8或10.也就是说,2015年实际上应该是2019年到2029年。
答案 1 :(得分:5)
首先是代码中的漫游时间错误:没有log.Errorf()
函数(即如果您使用标准log
包)。而是使用例如log.Printf()
。
其次,正如您的错误所述:month out of range
。如果1..12
,则月份在范围内。月份值0
或00
无效。请参阅valid months here。
零时间(或更精确的术语:类型zero value的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 db?),因此在检测到此日期的Go中,我将返回Go 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上的示例。
答案 2 :(得分:1)
时间类型的零值为January 1, year 1, 00:00:00.000000000 UTC。所以Go中没有0个月。