Python和macOS上出现意外的strftime()行为

时间:2017-08-24 17:07:59

标签: python python-3.x macos-sierra strftime

我正在使用datetime.strftime()的输出获得不一致的行为。

我正在使用macOS Sierra 10.12.6和Python 3.6.2。我有一个名为wut.py的Python程序,它是

#!/usr/bin/python
from datetime import datetime
import locale
if __name__ == "__main__":
    print(locale.getlocale())
    print(datetime.today().strftime('%c'))

在终端中,我写

$ date
Gio 24 Ago 2017 18:54:01 CEST

这是意大利人写日期的方式。然后

$ python3 ~/Desktop/wut.py 
('it_IT', 'UTF-8')
Thu Aug 24 18:54:03 2017

其中日期和时间以其他语言环境写入。这是怎么回事?这是一个错误还是有这种行为的原因?

我很困惑,因为Python文档提到%c引用“Locale的适当日期和时间表示。”所以我认为系统的语言环境是“合适的”;)(见{{3 },sec 8.1.8)

3 个答案:

答案 0 :(得分:2)

有许多不同的区域设置类别都是独立配置的,locale.getlocale()只能让您设置LC_CTYPE类别。时间格式由LC_TIME类别控制,您可以使用locale.getlocale(locale.LC_TIME)检查。

您可以使用locale.setlocale(locale.LC_ALL, '')将所有区域设置类别的设置设置为用户的默认设置(通常在LANG环境变量中指定)。 setlocale不是线程安全的,所以这通常接近程序的开头。

答案 1 :(得分:1)

稍微深入getdefaultlocale()模块,我在locale.setlocale(locale.LC_ALL, '') 的描述中找到了这个:

  

根据POSIX,一个尚未调用的程序           setlocale(LC_ALL,"")使用便携式' C'语言环境。           调用setlocale(LC_ALL,"")可以使用默认语言环境           由LANG变量定义。因为我们不想干涉           使用当前的语言环境设置,我们可以模拟行为           以上述方式。

从此,我认为打电话是好的做法

strftime

将您的区域设置设置为您希望从调用方的环境继承的区域设置。这样做,你应该得到locale.getdefaultlocale()的预期输出。

那就是说,我注意到我的macOS 10.12安装上Python 2.7和Python 3.6之间的行为有所不同。在启动时,locale.getlocale()('en_US', 'UTF-8')都会在Python 3中返回getlocale()。但在Python 2中,(None, None)会返回setlocale,直到我调用setlocale为止。在任何一种情况下,strftime仍然需要调用C才能实际使用设置的区域设置,而不是默认的$query1 = QB::table('personnel_role') ->select(QB::raw('IF(personnel.nickname != "",CONCAT(IFNULL(personnel.first_name,"")," ", IFNULL(personnel.last_name, ""), " (",personnel.nickname,")"), CONCAT(IFNULL(personnel.first_name,"")," ", IFNULL(personnel.last_name,""))) AS "name", personnel.id')) ->leftJoin('personnel', 'personnel_role.personnel_id', '=', 'personnel.id'); if ($params['roles']) { $query1->whereIn('personnel_role.role_id', $params['roles']) } $query1->groupBy('personnel.id') ->limit($params['skip']) ->offset($params['start']); 区域设置。我不知道这是否代表了一个错误,或者如果是这样,哪一个是错误的实例。

答案 2 :(得分:-1)

python结果是正确的,strftime('%c')返回相同的结果格式。