我想将以下字符串解析为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使用一组不同的常量?
答案 0 :(得分:6)
目前没有i18n支持时间包。在等待这种情况发生时,您可以尝试使用包装程序包,例如:
正如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日,它将为您返回正确的翻译日期。