我正在使用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)
答案 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')返回相同的结果格式。