00:00:00怎么解析

Ant*_*unt 6 mysql time parsing 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)
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

err parsing time "0000-00-00 00:00:00": month out of range, checkin 0000-00-00 00:00:00
Run Code Online (Sandbox Code Playgroud)

wal*_*lyk 5

这不解析,因为没有零年.公元前1年是公元1年

对于大多数情况,对零年份进行特殊检查并在其位置存储NULL值可能是有意义的.


从实际的角度来看,公元1年至公元600年左右的任何日期都记录不清,可能是错误的.在某处错过了几年.学者们不确定有多少,但他们大多同意至少4年失踪,可能多达8或10年.也就是说,2015年实际应该是2019年至2029年.

  • 事实上,情况并非如此。年“0”可以由 Go 的“time”包解析(如我的答案所示)。问题是月份“0”。 (2认同)

icz*_*cza 5

首先是代码中的编译时错误:没有log.Errorf()函数(也就是说,如果您使用的是标准log软件包)。而是使用例如log.Printf()

其次,错误状态如下:month out of range。如果月份在范围内1..120或的月份值00无效。在这里查看有效月份

零时间(或更精确的术语:类型的零值time.Time)由以下方式打印:

log.Println("Zero time is:", time.Time{}.Format("2006-01-02 15:04:05"))
Run Code Online (Sandbox Code Playgroud)

输出:

2009/11/10 23:00:00 Zero time is: 0001-01-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

注意,年,月和日都是1

还要注意,即使天数从开始10也可以接受-1day,并且将其解释为年和月部分指定的月份的第一天。

因此,虽然"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)
}
Run Code Online (Sandbox Code Playgroud)

请参阅有关 Go Playground