为了账号安全,请及时绑定邮箱和手机立即绑定

如何解析 0000-00-00 00:00:00?

如何解析 0000-00-00 00:00:00?

Go
慕仙森 2021-11-08 10:19:33
我正在解析 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 回答

?
米脂

TA贡献1836条经验 获得超3个赞

首先是你的代码中的一个commile time错误:没有log.Errorf()函数(也就是说,如果你使用的是标准log包)。而是使用例如log.Printf().


其次,由于您的错误指出:month out of range。如果 ,则月份在范围内1..12。0或的月份值00无效。在此处查看有效月份。


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

}


查看完整回答
反对 回复 2021-11-08
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

这不会解析,因为没有年份零。1 BC 之后是 1 AD

在大多数情况下,对第 0 年进行特殊检查并在其位置存储 NULL 值可能是有意义的。


从实际的角度来看,任何在公元 1 年到公元 600 年左右的年份中给出的任何日期都没有很好的记录,并且很可能是错误的。有些地方错过了几年。学术界不确定有多少,但他们大多同意至少缺少 4 年,可能多达 8 年或 10 年。也就是说,2015 年实际上应该是 2019 年到 2029 年。


查看完整回答
反对 回复 2021-11-08
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

Time 类型的零值是UTC 1 年 1 月 1 日 00:00:00.000000000。所以 Go 中没有 0 月。


查看完整回答
反对 回复 2021-11-08
  • 3 回答
  • 0 关注
  • 433 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信