如何在Python中为特定地区获取正确的日期格式字符串而不全局设置地区?

6 投票
2 回答
851 浏览
提问于 2025-04-18 06:16

我正在尝试生成包含日期的字典,并希望能够根据不同的地区来获取这些日期。比如,当我用en_US作为参数调用我的函数时,我希望它返回这样的结果:

{'date': 'May 12, 2014', ...}

而当我用hu_HU调用时,它应该返回这样的结果:

{'date': '2014. május 12.', ...}

根据我目前找到的信息,我应该使用locale.setlocale()来设置我想要的地区,然后用locale.nl_langinfo(locale.D_FMT)来获取合适的日期格式。在这之后,我可以调用locale.resetlocale()来恢复到之前使用的地区设置,但我的程序使用了多个线程,我担心其他线程也会受到这个临时地区变化的影响。

2 个回答

1

虽然这样做可能会花费一些时间和资源,但在你开始线程之前,先建立一个包含 国家代码: 日期时间格式 的字典怎么样?

for lang in lang_codes:
    locale.setlocale(lang)
    time_format[lang] = locale.nl_langinfo(locale.D_FMT)
locale.resetlocale()

这样的话,你在需要特定格式的日期时,就可以直接使用这些格式字符串,比如 time.strftime(time_format[lang], t)。当然,这样做并不能解决格林威治标准时间(GMT)的时差问题。

更好的方法是找出 locale 是从哪里获取这些映射的,但我现在不知道这个,也没有时间去研究。

6

有一个非标准的 babel 模块,它提供了这个功能,还有很多其他的功能:

>>> import babel.dates
>>> babel.dates.format_datetime(locale='ru_RU')
'12 мая 2014 г., 8:24:08'
>>> babel.dates.format_datetime(locale='de_DE')
'12.05.2014 08:24:14'
>>> babel.dates.format_datetime(locale='en_GB')
'12 May 2014 08:24:16'
>>> from datetime import datetime, timedelta
>>> babel.dates.format_datetime(datetime(2014, 4, 1), locale='en_GB')
'1 Apr 2014 00:00:00'
>>> babel.dates.format_timedelta(datetime.now() - datetime(2014, 4, 1), 
                                 locale='en_GB')
'1 month'

撰写回答