
from datetime import datetime from pytz import timezone tzc = timezone('PRC') tzu = timezone('US/Hawaii') time = datetime.utcnow() print('C:'+time.replace(tzinfo=tzc).astimezone(tz=tzc).strftime('%H')) print('U:'+time.replace(tzinfo=tzu).astimezone(tz=tzu).strftime('%H')) 为毛两个输出是一样的?
1 petelin 2017 年 9 月 20 日 In [24]: from datetime import datetime ...: from pytz import timezone ...: import pytz ...: tzc = timezone('PRC') ...: tzu = timezone('US/Hawaii') ...: ...: time = datetime.utcnow() ...: ...: print('C:'+time.replace(tzinfo=tzc).astimezone(tz=pytz.utc).strftime('%H')) ...: print('U:'+time.replace(tzinfo=tzu).astimezone(tz=pytz.utc).strftime('%H')) ...: C:04 U:23 |
2 petelin 2017 年 9 月 20 日 时间的比较应该在同一个时区下. 还有 replace 有坑, 使用 tzc.localize 更好 |
3 cevincheung OP @petelin #2 关键是 python 输出个时间要这么麻烦吗? |
4 cevincheung OP @petelin #1 py3.5.2 表示两个输出一毛一样 |
5 cevincheung OP |
6 NoAnyLove 2017 年 9 月 20 日 Python 本身的时区支持好像有问题,我之前遇到这个问题是直接用的第三方库,pendulum,https://github.com/sdispater/pendulum。简单,好用, ``` pendulum.now('Asia/Shanghai') |
7 NoAnyLove 2017 年 9 月 20 日 Orz,不知道怎么按到 Enter 了,重新来。 ``` import pendulum t1=pendulum.now('Asia/Shanghai') t2=t1.in_timezone('US/Hawaii') # 下面两个的输出绝对不一样 t1.strftime("%H") t2.strftime("%H") ``` |
8 yemoluo 2017 年 9 月 20 日 @cevincheung 因为你理解错了 time.replace 的意思了。 可以这样用 ```python from datetime import datetime from pytz import timezone tzc = timezone('PRC') tzu = timezone('US/Hawaii') now = datetime.now(pytz.utc) now.astimezone(tzc).strftime('%H') now.astimezone(tzu).strftime('%H') ``` |
9 cevincheung OP |
&nbs; 10 cevincheung OP @GTim #8 这样是 ok 了,好吧。replace 不能这么用。 但是好蛋疼啊。数据库里存的是 utf 时间戳,格式化显示的时候要根据用户浏览器、个人设置重新格式化,看来要弄个全局的 utils.timestamp_format 了 |
11 congminghaoxue92 2017 年 9 月 21 日 arrow 大法好,建议用 arrow http://arrow.readthedocs.io/en/latest/ |
13 cevincheung OP @blless #12 所以时区处理没有官方包? |
14 ijophy 2017 年 9 月 21 日 翻了翻文档,给下我的实现,py3 下可以 from datetime import datetime from datetime import timezone from datetime import timedelta time_format = "%Y-%m-%d %H:%M:%S" bj_offset = timezone(timedelta(hours=8)) bj_datetime = datetime.now(bj_offset) time = bj_datetime.strftime(time_format) |
15 cevincheung OP |