關于這個問題,我想解析在命令行上傳遞給 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 關注
- 210 瀏覽
添加回答
舉報
0/150
提交
取消