string - 从字符串中获取整数月份值
问题描述
我正在从 AWS 解析一个看起来像这样的 cron 字符串cron(0 7 13 November ? 2019)
。有没有一种干净的方法可以从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
}
解决方案
前言:我在 中发布了这个实用程序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
}
另请注意,可以使用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"
但是简单的地图查找在性能上要优于这个。
推荐阅读
- performance - 性能问题:使用 Gunicorn + Tornado 的异步 gRPC
- android - 我怎样才能膨胀 ArrayList
> 对 RecyclerView 的价值 - highcharts - Highcharts点击功能更新系列并取消之前的更新
- javascript - 如何使按钮在网页上显示表单
- scala - 无法从 hdp 3 中超过 25 列的 spark 数据帧加载配置单元表
- angular - 如何提高 Rxjs 的表达?
- shell - 使用 shell 脚本迭代地图的 groovy 地图
- java - RecylerView 没有出现在片段中
- python - 遍历python中的列表抛出错误
- flutter - Flutter listview builder滚动控制器侦听器不在列表视图中触发?