关于这个问题,我想解析在命令行上传递给 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")
}
波斯汪
TA贡献1811条经验 获得超4个赞
在事先不知道格式的情况下解析许多日期字符串。使用扫描仪读取字节并使用状态机查找格式。
t, err := dateparse.ParseAny("3/1/2014")
慕盖茨4494581
TA贡献1850条经验 获得超11个赞
在您描述的特定场景中,您可以检查输入日期戳字符串的长度,并在其末尾添加适当长度的零内容以对应于您的layout
. 所以基本上你可以将尽可能多的字符串"T00:00:00"
(从末尾计数)附加到输入,因为与格式字符串相比长度缺失layout
。
- 3 回答
- 0 关注
- 158 浏览
添加回答
举报
0/150
提交
取消