00:00:00怎么解析

时间:2015-09-07 05:39:17

标签: mysql parsing time go

我正在从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

3 个答案:

答案 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,则月份在范围内。月份值000无效。请参阅valid months here

零时间(或更精确的术语:类型zero valuetime.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个月。