在Python3.4.x(Windows10Home)中执行这些命令

import locale
from datetime import datetime
locale.setlocale(locale.LC_ALL, 'Spanish')
datetime.strftime(datetime.now(), '%a %d %b %Y')

呈现输出
'Spanish_Spain.1252'
'mar 07 jun 2016'

但是对于Python3.5.x,输出是
'Spanish_Spain.1252'
'ma. 07 jun. 2016'

我找不到关于这一变化的任何信息。

最佳答案

好的,我把问题发给了Python bug跟踪器,Eryk Sun回答了我的问题:
3.5+使用的通用CRT使用Windows实现区域设置
Vista中引入的语言环境名称[1]。西班牙语示例
包括“是”、“是”和“是-是-传统”。后者是
西班牙的传统分类,它有3个字母的缩写
一周中的几天。西班牙默认的是现代风格
使用两个字母的缩写。
旧的LCID系统[2]默认为传统排序(0x40A),为
旧的阴极射线管映射不合格的“西班牙语”。现代排序(0xC0A)
可用作“西班牙现代”[3]。通用阴极射线管仍然是荣誉的
“西班牙语现代”[4],但仅“西班牙语”本身被映射为
中性的“es”,使用现代的排序。
如果需要在两个版本中使用传统形式,则在3.4中
它只是“西班牙语”,但3.5+需要一个带有排序的地区名称
后缀。实际上,我在MSDN上找不到列出
“tradnl”排序名称附加到“es”,因此我编写了一个快速脚本
找到它,假设至少“tra”在名称中:

import re
import ctypes

kernel32 = ctypes.WinDLL('kernel32')

LOCALE_ENUMPROCEX = ctypes.WINFUNCTYPE(
    ctypes.c_int,
    ctypes.c_wchar_p,
    ctypes.c_uint,
    ctypes.c_void_p)

def find_locale(pattern):
    result = []
    @LOCALE_ENUMPROCEX
    def cb(locale, flags, param):
        if re.match(pattern, locale, re.I):
            result.append(locale)
        return True
    kernel32.EnumSystemLocalesEx(cb, 0, None, None)
    result.sort()
    return result

>>> find_locale('es-.*TRA.*')
['es-ES_tradnl']

>>> import locale, time
>>> locale.setlocale(locale.LC_TIME, 'es-ES_tradnl')
'es-ES_tradnl'
>>> time.strftime('%a')
'mié'

注意,西班牙语中的缩写通常以句号结尾。它是
除了西班牙以外的每个国家,如墨西哥:
>>> locale.setlocale(locale.LC_TIME, 'spanish_mexico')
'Spanish_Mexico.1252'
>>> time.strftime('%a')
'mié.'

或者使用区域设置名称(3.5+):
>>> locale.setlocale(locale.LC_TIME, 'es-MX')
'es-MX'
>>> time.strftime('%a')
'mié.'

请注意,Python仍然不支持分析区域设置名称:
>>> locale.getlocale(locale.LC_TIME)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python35\lib\locale.py", line 578, in getlocale
    return _parse_localename(localename)
  File "C:\Program Files\Python35\lib\locale.py", line 487, in _parse_localename
    raise ValueError('unknown locale: %s' % localename)
ValueError: unknown locale: es-MX

因为区域设置名称不包含编码,所以解析它们
getlocale()将需要额外的调用来获取区域设置的ANSI
代码页,以防有人想更新语言环境模块以支持
这:
>>> LOCALE_IDEFAULTANSICODEPAGE = 0x1004
>>> buf = (ctypes.c_wchar * 10)()
>>> kernel32.GetLocaleInfoEx('es-MX', LOCALE_IDEFAULTANSICODEPAGE, buf, 10)
5
>>> buf.value
'1252'

如果这里没有人有其他问题,我将把这个问题作为第三个问题来解决
一天左右的聚会。“西班牙语”的语言环境不一致
不同版本的CRT地图完全是微软的
问题。
[1]:https://msdn.microsoft.com/en-us/library/dd373814[2]:
https://msdn.microsoft.com/en-us/library/dd318693[3]:
https://msdn.microsoft.com/en-us/library/39cwe7zf%28v=vs.100%29.aspx
[4]:https://msdn.microsoft.com/en-us/library/39cwe7zf.aspx
http://bugs.python.org/msg267835

关于python - python 3.4 vs.3.5 strftime相同语言环境不同的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37688012/

10-12 21:21