Нужно распарсить string в time.Duration. Формат "HH:MM:SS"
В Go уже есть весьма удобный парсинг дат, можно прочесть строку через
time.Parse("15:04:05", stringToParse)
, но из далее из этого нужно получить
time.Duration{}
. Мне показалось что в стандартной библиотеке есть другой удобный метод
time.Sub()
.
Казалось бы подобный код должен работать:
func parseDur(s string) time.Duration {
t, _ := time.Parse("15:04:05", s)
return t.Sub(time.Time{})
}
Но этот код возвращает
time.Duration{}
минус 1 год. Можно пофиксить возвращая
t.AddDate(1, 0, 0).Sub(time.Time{})
но это же так уродски выглядит.
Я это к чему, нулевое значение времени в Go это
0001-01-01 00:00:00 +0000 UTC
но
time.Parse()
по дефолту возвращает
0000-01-01 00:00:00 +0000 UTC
. Это выглядит странным. Не является ли это каким-то косяком дизайна и не нуждается ли в исправлении на уровне стандартной библиотеки?
Основной вопрос "как парсить элегантно" остаётся в силе, может у кого есть какие-то красивые методы без странных констант.