【问题标题】:How to use multiple formats to parse dates in a loop?如何使用多种格式循环解析日期?
【发布时间】:2020-06-30 15:42:53
【问题描述】:

我正在尝试读取一个巨大的 csv 文件,其中的日期列具有 2 种可能的非标准格式的值...

  1. 12/28/2015 -- mm/dd/yyyy
  2. 11/2/2013 -- mm/d/yyyy

...表示中间部分可以是一位数或两位数。

我从这个很好的老问题中学会了如何使用格式:Parsing date/time strings which are not 'standard' formats。但是由于我要循环尝试解析每一行,所以我一次只能指定一种格式。现在它在查找不同格式的日期值时出错。也许我可以在 parse-using-format#1 失败时编写代码来捕获错误,然后应用 format#2,而不是出错。但是有人可以指点我一个更好/正确的方法吗?

包含日期字符串数组的示例代码:https://play.golang.org/p/aloIQnrkOjK

package main

import (
    "fmt"
    "time"
)

func main() {
    const format = "01/02/2006" //mm/dd/yyyy
    var list [2]string = [2]string{"12/28/2015", "11/2/2013"}
    for _, data := range list {
        t, err := time.Parse(format, data)
        if err != nil {
            fmt.Println("Error is: ", err)
        } else {
            fmt.Println("Value is: ", t)
        }
    }
}

//输出:

值为:2015-12-28 00:00:00 +0000 UTC

错误是:将时间“11/2/2013”​​解析为“01/02/2006”:无法将“2/2013”​​解析为“02”

【问题讨论】:

  • 这是一个关于如何做到这一点的示例:github.com/spf13/cast/blob/master/caste.go#L1206。更好的是,您可以使用这个库来获得开箱即用的功能。
  • 循环内如果err是nil,则返回,不要继续下一个格式。仅在出现错误时尝试更多(下一个)格式。循环结束后,如果所有格式都不起作用,则返回错误。
  • "01/2/2006" 解析这两个字符串都没有错误。即使是前导零也不是问题。
  • 谢谢大家的建议。在这些 cmets 中,我发现 @Peter 的解决方案是最简单的。不知道我们可以用'2'来表示月份的一位+两位数。

标签: go


【解决方案1】:

问题中的代码使用一种格式解析多个日期。问题是其中一个日期与格式不匹配(当天缺少前导零)。通过使前导零可选来修复:

const format = "1/2/2006" // remove zero before day (and month just in case)

【讨论】:

    猜你喜欢
    • 2013-01-09
    • 2011-04-30
    • 2018-02-07
    • 2020-09-14
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多