В дополнение к этому вопросу я хочу проанализировать дату / время, переданные в командной строке, в программу 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 способ сделать это?
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)
}
}
}