进一步到this question,我想解析在命令行上传递给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
等。
但是,如果可能的话,我想通过的灵活性是2019-05-20T09:07
或2019-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)
}
}
}
答案 0 :(得分:2)
我认为您正在寻找这个图书馆https://github.com/araddon/dateparse
解析许多日期字符串而无需事先知道格式。使用扫描器读取字节并使用状态机查找格式。
t, err := dateparse.ParseAny("3/1/2014")
答案 1 :(得分:2)
只需尝试每种格式,直到一种有效。如果没有任何效果,请返回错误。
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")
}
答案 2 :(得分:1)
在您描述的特定情况下,您可以检查输入日期戳字符串的长度,并在其末尾添加适当长度的零填充,以与您的layout
相对应。因此,基本上,您可以将"T00:00:00"
字符串(从末尾算起)附加到与layout
格式字符串相比长度缺失的地方。