如何在不在Python中设置程序范围的语言环境的情况下获取给定语言环境的正确日期格式字符串?

时间:2014-05-12 07:54:05

标签: python python-2.7 locale

我试图生成包含可以在特定区域设置中提供的日期的词典。例如,我可能希望我的函数在使用en_US作为参数调用时返回它:

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

这个,当用hu_HU调用时:

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

现在,基于我迄今为止发现的内容,我应该使用locale.setlocale()来设置我想要使用的区域设置,并使用locale.nl_langinfo(locale.D_FMT)来获取适当的日期格式。我可以在此之后调用locale.resetlocale()返回之前使用的版本,但我的程序使用多个线程,并且我认为其他线程也会受到此临时区域设置更改的影响。

2 个答案:

答案 0 :(得分:5)

有一个非标准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'

答案 1 :(得分:1)

这可能很昂贵但是在开始你的线程之前如何构建country code: datetime format条目的字典?

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从哪里获取映射,但我不知道,现在没有时间进行调查。