关于这个问题,我想解析在命令行上传递给 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 main
import (
"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)
}
}
}
慕桂英4014372
波斯汪
慕盖茨4494581
相关分类