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

Go中灵活的日期/时间解析(在解析中添加默认值)

Go中灵活的日期/时间解析(在解析中添加默认值)

Go
qq_花开花谢_0 2023-06-19 17:19:43
关于这个问题,我想解析在命令行上传递给 Go 程序的日期/时间。目前,我使用flag包来填充一个字符串变量ts,然后使用以下代码:if ts == "" {    config.Until = time.Now()} else {    const layout = "2006-01-02T15:04:05"    if config.Until, err = time.Parse(layout, ts); err != nil {        log.Errorf("Could not parse %s as a time string: %s. Using current date/time instead.", ts, err.Error())        config.Until = time.Now()    }}这可以正常工作,前提是用户传递了完全正确的格式 - 例如2019-05-20T09:07:33或类似的格式。但是,如果可能的话,我想要的是可以灵活地传递 eg 2019-05-20T09:07or2019-05-20T09或什至2019-05-20传递,并在适当的情况下将小时、分钟和秒默认为 0。有没有一种理智的方法可以做到这一点?1基本上不需要我编写自己的解析器更新我有一个解决方案,虽然它不是特别优雅,但它似乎适用于我可能遇到的大多数情况。package mainimport (    "fmt"    "time")func main() {    const layout = "2006-01-02T15:04:05"    var l string    var input string    for _, input = range []string{"2019-05-30", "2019-05-30T16", "2019-05-30T16:04", "2019-05-30T16:04:34",                                "This won't work", "This is extravagantly long and won't work either"} {        if len(input) < len(layout) {            l = layout[:len(input)]        } else {            l = layout        }        if d, err := time.Parse(l, input); err != nil {            fmt.Printf("Error %s\n", err.Error())        } else {            fmt.Printf("Layout %-20s gives time %v\n", l, d)        }    }}
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

只需尝试每种格式,直到一种有效。如果无效,则返回错误。


var formats = []string{"2006-01-02T15:04:05", "2006-01-02", ...}


func parseTime(input string) (time.Time, error) {

    for _, format := range formats {

        t, err := time.Parse(format, input)

        if err == nil {

            return t, nil

        }

    }

    return time.Time{}, errors.New("Unrecognized time format")

}


查看完整回答
反对 回复 2023-06-19
?
波斯汪

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

在事先不知道格式的情况下解析许多日期字符串。使用扫描仪读取字节并使用状态机查找格式。

t, err := dateparse.ParseAny("3/1/2014")


查看完整回答
反对 回复 2023-06-19
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

在您描述的特定场景中,您可以检查输入日期戳字符串的长度,并在其末尾添加适当长度的零内容以对应于您的layout. 所以基本上你可以将尽可能多的字符串"T00:00:00"(从末尾计数)附加到输入,因为与格式字符串相比长度缺失layout



查看完整回答
反对 回复 2023-06-19
  • 3 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

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