python time.strftime('%Y-%m-%d %X %Z') 时区显示为乱码,本应该是 中国标准时间

2015-07-27 23:06:40 +08:00
 sbmzhcn
#-*- coding: utf-8 -*-

import time


print(time.strftime('%Y-%m-%d %X %Z'))

结果为2015-07-27 23:04:04 Öйú±ê׼ʱ¼ä

乱码应该是中国标准时间。请问为什么会这样?不解。
8727 次点击
所在节点    Python
21 条回复
julyclyde
2015-07-27 23:09:14 +08:00
1 我这里是CST结尾,不是几个汉字结尾
2 你运行该程序的console是UTF-8的吗?Windows cmd应该是GBK的吧
VicYu
2015-07-27 23:15:18 +08:00
win7 python2.7 ipython测试为中国标准时间
Mac python2.7 console测试为CST

表示,如果是乱码,试试.encode('GBK')
lilydjwg
2015-07-27 23:34:50 +08:00
基本可以确定:

* 你使用的是 Python 2
* 你使用的是 Windows

这些乱码是由于将 GBK 编码的字符串当作 latin1 编码解释造成的。你需要设置显示这些文字的工具使用 GBK 编码来解释该输出。
lilydjwg
2015-07-27 23:35:45 +08:00
@VicYu strftime 的返回值是 bytes,不应当再使用 .encode 方法进行编码——它已经是 GBK 编码的了。
ligyxy
2015-07-27 23:54:59 +08:00
楼主在CMD里运行的?
sbmzhcn
2015-07-28 08:45:09 +08:00
我在pycharm里面运行的。在sublime运行一样出错。在pyhton自带的ide里面运行正常。用的是windows7 python3
VicYu
2015-07-28 15:07:42 +08:00
@lilydjwg strftime返回值是string,题主用的python3,默认编码是utf-8
lilydjwg
2015-07-28 15:09:16 +08:00
@VicYu Python 3?那是输出到什么地方了?写到文件里然后拿另外的软件打开?
lilydjwg
2015-07-28 15:11:03 +08:00
@sbmzhcn 哦哦,是在奇怪的环境里执行的。出问题的原因应该是这些工具给 Python 3 提供的终端的编码处理有问题。Python 3 给它们输出了操作系统默认的 GBK 编码,而它们却当成 latin1 编码给显示出来了。

一句话说就是:pycharm 和 sublime 的中文支持有问题。
VicYu
2015-07-28 15:38:33 +08:00
@sbmzhcn

print(time.strftime('%Y-%m-%d %X %Z').decode('GBK').encode('utf-8'))
VicYu
2015-07-28 15:44:02 +08:00
@lilydjwg 大哥,你能不能不要一个洞一个洞挖了填,填了挖,回答问题就有个回答问题的态度。

升级python3一直以来最大的好处就是默认编码unicode换成utf8。pycharm和sublime都是utf-8默认编码,并且sublime在执行的时候会转换为ascii的编码环境,此编码环境的utf-8支持输出。

time.strftime的输出是str类型,strftime对输出编码进行了系统匹配,这是函数的问题。
VicYu
2015-07-28 16:16:22 +08:00
@sbmzhcn

http://svn.python.org/view/python/trunk/Modules/timemodule.c?revision=81756&view=markup

在查看了time函数的源码后,508行

buflen = strftime(outbuf, i, fmt, &buf);

time函数实现时调用C库的strftime() 。那这个函数的实现就是系统相关的,对于现在的编码问题,就是win的c库strftime() %Z返回的GBK编码的‘中国标准时间’。
lilydjwg
2015-07-28 16:27:10 +08:00
@VicYu 首先,不要叫我大哥。

你不要不懂 Python 乱说话。你都知道 strftime 的输出是 str 类型的了,却不知道 str 是不区分编码的?str 就是字符串,映射到 Unicode 码点的,编码无关。Python 在**输出** str 的时候根据输出目标(或者系统默认,如果没办法知道输出目标是支持什么编码的话)来决定用什么字符编码把 str 编码成 bytes。pycharm 等没能正确地告诉 Python 它会以 latin1(or whatever)来解释 Python 的输出,所以乱码了。
VicYu
2015-07-28 16:30:15 +08:00
@lilydjwg

你就自己填坑吧,触不了的逆鳞,你都是对的。
lilydjwg
2015-07-28 16:30:27 +08:00
@VicYu 在 Python 3 里,你不能 decode 一个 str,因为它是已解码数据。同样,你也不能 encode 一个 bytes,因为它是已编码数据。

AttributeError: 'str' object has no attribute 'decode'

态度?回答是错的态度再好有什么用?
VicYu
2015-07-28 16:46:34 +08:00
@lilydjwg

那我不叫你大哥,知道你是大神,原来就听过你的名头,实在不敢与你探讨,隐了。
lilydjwg
2015-07-28 17:53:23 +08:00
@VicYu 也不要叫我大神。v2ex 又不是没显示用户名字。

你给提问者的语句在你那里不会报错么?
sbmzhcn
2015-07-29 13:48:09 +08:00
@VicYu print(time.strftime('%Y-%m-%d %X %Z').decode('GBK').encode('utf-8')) 这个执行不了的。因为str不能decode. AttributeError: 'str' object has no attribute 'decode'

我知道是编码问题,在linux上面应该没这个问题。非常小的问题,但看到出现乱码就心里不爽。 现在还没找到解决办法。
seeds
2019-02-14 09:56:37 +08:00
如果是在 pycharm 中运行的话,%Z 显示时区会有编码问题,time 函数中支持小写的%z 显示时区
greedyboy
2019-05-10 22:19:32 +08:00
@VicYu @lilydjwg 辛苦给个解决问题的答案吧,还没解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/208765

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX