Получить целочисленное значение месяца из строки - PullRequest
2 голосов
/ 10 января 2020

Я анализирую строку cron из AWS, которая выглядит следующим образом cron(0 7 13 November ? 2019). Есть ли чистый путь к go из November обратно к 11 с использованием встроенных типов Go? Тип time.Month позволяет отображать int в string, но, похоже, нет способа сделать обратное. Я что-то пропустил? Сейчас я написал это, чтобы получить map[string]int, который я использую следующим образом: monthi := getMonths()[monthName].

func getMonths() map[string]int {
    m := make(map[string]int)
    for i := 1; i < 13; i++ {
        month := time.Month(i).String()
        m[month] = i
    }
    return m
}

1 Ответ

4 голосов
/ 10 января 2020

Предисловие: Я выпустил эту утилиту в github.com/icza/gox, см. timex.ParseMonth().


Это в настоящее время лучший подход.

Лучше всего было бы использовать переменную уровня пакета и заполнить карту только один раз.

И сделать население таким способом намного чище и безопаснее:

var months = map[string]time.Month{}

func init() {
    for i := time.January; i <= time.December; i++ {
        months[i.String()] = i
    }
}

Тестирование:

for _, s := range []string{"January", "December", "invalid"} {
    m := months[s]
    fmt.Println(int(m), m)
}

Вывод (попробуйте на Go Playground ):

1 January
12 December
0 %!Month(0)

Обратите внимание, что эта карта обладает гибкостью, которая Вы можете добавить короткие названия месяцев, сопоставляя их с тем же месяцем. Например, вы также можете добавить months["Jan"] = time.January, поэтому, если вы введете "Jan", вы также сможете получить time.January. Это можно легко сделать, нарезав длинное имя в том же l oop, например:

for i := time.January; i <= time.December; i++ {
    name := i.String()
    months[name] = i
    months[name[:3]] = i
}

Также обратите внимание, что можно использовать time.Parse() для выполнения парсинг, где строка макета "January":

for _, s := range []string{"January", "December", "invalid"} {
    t, err := time.Parse("January", s)
    m := t.Month()
    fmt.Println(int(m), m, err)
}

Какие выходные данные (попробуйте на Go Playground ):

1 January <nil>
12 December <nil>
1 January parsing time "invalid" as "January": cannot parse "invalid" as "January"

Но простой Поиск по карте превосходит это по производительности.

См. аналогичный вопрос: Анализ строки дня недели по времени. Выходной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...