python time.strftime('%Y-%m-%d %X %Z') 时区显示为乱码,本应该是 中国标准时间 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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

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

  •  
  •   sbmzhcn Jul 27, 2015 9167 views
    This topic created in 3927 days ago, the information mentioned may be changed or developed.
    #-*- coding: utf-8 -*-

    import time


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

    结果为2015-07-27 23:04:04 ú±ê×±

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

    表示,如果是乱码,试试.encode('GBK')
    lilydjwg
        3
    lilydjwg  
       Jul 27, 2015
    基本可以确定:

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

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

    一句话说就是:pycharm 和 sublime 的中文支持有问题。
    VicYu
        10
    VicYu  
       Jul 28, 2015
    @sbmzhcn

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

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

    time.strftime的输出是str类型,strftime对输出编码进行了系统匹配,这是函数的问题。
    VicYu
        12
    VicYu  
       Jul 28, 2015
    @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  
       Jul 28, 2015
    @VicYu 首先,不要叫我大哥。

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

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

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

    态度?回答是错的态度再好有什么用?
    VicYu
        16
    VicYu  
       Jul 28, 2015
    @lilydjwg

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

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

    1. 你是在什么东西( IDE 还是什么)里看到这个乱码的?
    2. 你是 Python 2 还是 Python 3 ?
    3. 你的操作系统是什么?
    About     Help     Advertise     Blog     API     FAQ     Solana     5572 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 09:14 PVG 17:14 LAX 02:14 JFK 05:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86