为了账号安全,请及时绑定邮箱和手机立即绑定

从字符串中获取整数月份值

从字符串中获取整数月份值

Go
慕尼黑8549860 2022-05-05 15:52:13
我正在从 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}
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

前言:我在 中发布了这个实用程序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"

但是简单的地图查找在性能上要优于这个。


查看完整回答
反对 回复 2022-05-05
  • 1 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信