V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sbmzhcn
V2EX  ›  Python

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

  •  
  •   sbmzhcn · 2015-07-27 23:06:40 +08:00 · 8730 次点击
    这是一个创建于 3402 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #-*- coding: utf-8 -*-

    import time


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

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

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

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

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

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

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

    print(time.strftime('%Y-%m-%d %X %Z').decode('GBK').encode('utf-8'))
    VicYu
        11
    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
        12
    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
        13
    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
        14
    VicYu  
       2015-07-28 16:30:15 +08:00
    @lilydjwg

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

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

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

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

    你给提问者的语句在你那里不会报错么?
    sbmzhcn
        18
    sbmzhcn  
    OP
       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
        19
    seeds  
       2019-02-14 09:56:37 +08:00
    如果是在 pycharm 中运行的话,%Z 显示时区会有编码问题,time 函数中支持小写的%z 显示时区
    greedyboy
        20
    greedyboy  
       2019-05-10 22:19:32 +08:00
    @VicYu @lilydjwg 辛苦给个解决问题的答案吧,还没解决
    lilydjwg
        21
    lilydjwg  
       2019-05-10 22:27:01 +08:00
    @greedyboy #20 是什么问题都搞不清楚怎么解决?请提供以下信息:

    1. 你是在什么东西( IDE 还是什么)里看到这个乱码的?
    2. 你是 Python 2 还是 Python 3 ?
    3. 你的操作系统是什么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:16 · PVG 04:16 · LAX 12:16 · JFK 15:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.