我正在从AWS解析一个cron(0 7 13 November ? 2019)
这样的cron字符串。是否有使用Go的内置类型从November
返回到11
的干净方法? 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
}
答案 0 :(得分:4)
序言:我在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
。可以通过在同一循环中将长名称切片来轻松完成此操作,例如:
for i := time.January; i <= time.December; i++ {
name := i.String()
months[name] = i
months[name[:3]] = i
}
还请注意,可以在布局字符串为"January"
的地方使用time.Parse()
进行解析:
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"
但是简单的地图查找在性能上胜于此。