如何在go中使用locale将日期转换为字符串?

q1qsirdb  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(148)

我用以下方法将日期转换为字符串:

d.Format("Mon 02. Jan")

我会得到这样的结果

Fri 27. Jan

如何切换区域设置并获取其他语言的字符串?

ijxebb2r

ijxebb2r1#

不能,Go语言的标准库中没有本地化的月份、日期和时区名称,这些名称都是绑定到time包中的。
例如,Month.String()返回的月份名称存储在未导出的time.month全局变量中:

var months = [...]string{
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December",
}

func (m Month) String() string { return months[m-1] }

类似地,工作日的名称来自Weekday.String(),存储在未导出的变量time.days中。
话虽如此,可能有第三方库支持您的需求。这里有一个不完整的库,可能会对您有所帮助:https://github.com/mattbaird/go-i18n-formats
正如Igor Chubin在下面分享的,这个第三方库要完整得多:https://github.com/klauspost/lctime
还要注意,虽然提供一个通用的多语言时间格式化包并不是一件容易的事情,但是如果您确实需要它,您可以使用time包,将它复制到您的项目中,然后将名称翻译成您需要的语言。
还请注意,由于支持的语言和布局数量较少,您可以轻松地自行创建格式。
例如,下面的代码使用您在问题中使用的布局,以匈牙利语格式化给定的time.Time值:

func Format(t time.Time) string {
    return fmt.Sprintf("%s %02d. %s",
        days[t.Weekday()][:3], t.Day(), months[t.Month()-1][:3],
    )
}

var days = [...]string{
    "Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat"}

var months = [...]string{
    "Január", "Február", "Március", "Április", "Május", "Június",
    "Július", "Augusztus", "Szeptember", "Október", "November", "December",
}

测试:

fmt.Println(Format(time.Now()))

Go Playground上的输出:

Ked 10. Nov

本地计算机上的输出:

Pén 27. Jan
sgtfey8w

sgtfey8w2#

您可以使用替代项作为问题的快速修复。德语示例:

r := strings.NewReplacer(
            "January", "Januar",
            "February", "Februar",
            "March", "März",
            "April", "April",
            "May", "Mai",
            "June", "Juni",
            "July", "Juli",
            "August", "August",
            "September", "September",
            "October", "Oktober",
            "November", "November",
            "December", "Dezember", )

time := inputTime.Format("2 January 2006")

outputString := r.Replace(time)

相关问题