【问题标题】:How to parse month in go from non-english String with如何从非英语字符串解析月份
【发布时间】:2014-02-11 08:30:31
【问题描述】:

我想将下面的字符串解析为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 使用不同的月份常量集

【问题讨论】:

    标签: time go


    【解决方案1】:

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

    github.com/goodsign/monday

    正如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

    【讨论】:

      【解决方案2】:

      sourcecode of format.go from package time 可以看出,天/月的名称被定义为变量 - (long|short)(Day|Month)Names。不幸的是,名称是小写的,这意味着它们不会被导出。如果是,您可以在调用 time.Parse() 之前修改它们。也许您应该提交错误以公开这些变量或提供修改它们的方法,或者自己做并提交补丁。当然,您也可以创建时间包的私有副本并在其中进行所需的更改。

      编辑:ANisus 建议的包装包以比我的建议更实用的方式解决了问题。不过,我的回答显示了您如何利用 Go 是开源的这一事实来自己调查标准库中问题的可能解决方案。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-16
          • 1970-01-01
          • 2021-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-18
          • 2012-11-18
          相关资源
          最近更新 更多