我正在解析来自 AWS 的 cron 字符串,如下所示cron(0 7 13 November ? 2019)。有没有一种干净的方法可以返回November到11使用 Go 的内置类型?该time.Month类型允许映射int到string,但似乎没有办法进行相反的操作。我错过了什么吗?现在,我写这个是为了得到map[string]int我正在使用的 a ,如下所示: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
}
Run Code Online (Sandbox Code Playgroud)
前言:我在 中发布了这个实用程序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
}
}
Run Code Online (Sandbox Code Playgroud)
测试它:
for _, s := range []string{"January", "December", "invalid"} {
m := months[s]
fmt.Println(int(m), m)
}
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上尝试):
1 January
12 December
0 %!Month(0)
Run Code Online (Sandbox Code Playgroud)
请注意,此映射具有灵活性,您可以添加短月份名称,映射到同一月份。例如你也可以添加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
}
Run Code Online (Sandbox Code Playgroud)
另请注意,可以用于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)
}
Run Code Online (Sandbox Code Playgroud)
哪个输出(在Go Playground上尝试):
1 January <nil>
12 December <nil>
1 January parsing time "invalid" as "January": cannot parse "invalid" as "January"
Run Code Online (Sandbox Code Playgroud)
但简单的地图查找在性能上要优于此。
查看类似的问题:Parse Weekday string into time.Weekday
| 归档时间: |
|
| 查看次数: |
779 次 |
| 最近记录: |