繁体   English   中英

00:00:00怎么解析

[英]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范围内。 月份值000无效。 在这里查看有效月份

零时间(或更精确的术语: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM