如何从非英语字符串解析月份

时间:2014-02-11 08:30:32

标签: time go

我想将以下字符串解析为go中的日期:

"This item will be released on March 9, 2014."

我跟着this然后出现了:

func findReleaseDateString(raw string) time.Time {
  test, err := time.Parse("This item will be released on January 2, 2006.", raw)
  if err != nil {
      panic(err)
  }

 return test
}

这就像英语字符串的魅力一样。

我的问题:我想解析德语字符串。像:

"Dieser Artikel wird am 9. März 2014 erscheinen."

我知道,我可以通过正则表达式匹配日,月和年,然后解析它。但 是否有可能告诉time.Parse使用一组不同的常量

3 个答案:

答案 0 :(得分:6)

目前没有i18n支持时间包。在等待这种情况发生时,您可以尝试使用包装程序包,例如:

  

github.com/goodsign/monday

正如monday的文件所述:

  

星期一不是标准时间套餐的替代品。这是一种临时解决方案,在国际化功能尚未准备就绪时使用。

     

这就是为什么星期一不会创建任何额外的解析算法,布局标识符。它只是time.Format和time.ParseInLocation的包装器,并使用所有相同的布局ID,常量等。

以下是使用monday的示例:

package main

import (
    "fmt"
    "github.com/goodsign/monday"
    "time"
)

func findReleaseDateString(raw string) time.Time {
    loc, _ := time.LoadLocation("Europe/Berlin")
    t, err := monday.ParseInLocation("Dieser Artikel wird am 2. January 2006 erscheinen.", raw, loc, monday.LocaleDeDE)
    if err != nil {
        panic(err)
    }

    return t
}

func main() {
    t := findReleaseDateString("Dieser Artikel wird am 9. März 2014 erscheinen.")
    fmt.Println(t)
}

<强>输出:

  

2014-03-09 00:00:00 +0100 CET

答案 1 :(得分:0)

sourcecode of format.go from package time可以看出,天/月的名称被定义为变量 - (长|短)(日|月)名称。不幸的是,名称是小写的,这意味着它们不会被导出。如果是,你可以在调用time.Parse()之前修改它们。也许您应该提交一个错误来公开这些变量或提供修改它们的方法,或者自己动手并提交补丁。当然,您也可以创建时间包的私有副本,并在那里进行必要的更改。

编辑:ANisus建议的包装程序包以比我的建议更务实的方式解决问题。不过,我的答案显示了你如何利用Go是开源的事实来自己研究标准库中问题的可能解决方案。

答案 2 :(得分:0)

您可以使用该月份的任何名称,例如2006年1月2日,它将为您返回正确的翻译日期。