Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得给定区域设置的正确日期格式字符串,而不在Python中设置该区域设置程序范围?_Python_Python 2.7_Locale - Fatal编程技术网

如何获得给定区域设置的正确日期格式字符串,而不在Python中设置该区域设置程序范围?

如何获得给定区域设置的正确日期格式字符串,而不在Python中设置该区域设置程序范围?,python,python-2.7,locale,Python,Python 2.7,Locale,我正在尝试生成包含日期的字典,这些日期可以要求在特定地区给出。例如,当使用en_US作为参数调用时,我可能希望我的函数返回: {'date':'2014年5月12日',…} 而这一点,在与胡胡胡通话时: {'date':'2014.május 12',…} 现在,根据我到目前为止的发现,我应该使用locale.setlocale()来设置我想要使用的区域设置,并使用locale.nl_langinfo(locale.D_FMT)来获得适当的日期格式。在此之后,我可以调用locale.rese

我正在尝试生成包含日期的字典,这些日期可以要求在特定地区给出。例如,当使用en_US作为参数调用时,我可能希望我的函数返回:

{'date':'2014年5月12日',…}
而这一点,在与胡胡胡通话时:

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

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

这样做可能会很昂贵,但是在开始你的线程之前,你可以为
国家代码:日期时间格式
条目建立一个字典吗

for lang in lang_codes:
    locale.setlocale(lang)
    time_format[lang] = locale.nl_langinfo(locale.D_FMT)
locale.resetlocale()
然后,只要需要特定格式的日期,就可以使用格式字符串
time.strftime(time\u format[lang],t)
。当然,这不包括GMT班次

更好的方法是找到
locale
从何处获取映射,但我不知道这一点,现在也没有时间进行调查。

有一个非标准模块提供了这一点和更多:

>>> 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'

这听起来很酷。你知道它是否是完全线程安全的吗?如果是,它是如何实现的?我不知道它是否是线程安全的,但我假设如果我必须实现它,我不会使用任何全局状态,而是为区域设置格式使用只读查找表,每当我必须格式化日期时都会使用它。事实上,显然巴贝尔在安装库时,然后在该文件中查找区域设置数据(或者更具体地说,在安装过程中从文件生成的映射中)。