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-09-20 20:41:51 +08:00
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-09-20 20:43:52 +08:00
时间的比较应该在同一个时区下. 还有 replace 有坑, 使用 tzc.localize 更好
|
3
cevincheung OP @petelin #2 关键是 python 输出个时间要这么麻烦吗?
|
4
cevincheung OP @petelin #1 py3.5.2 表示两个输出一毛一样
|
5
cevincheung OP @petelin #1
|
6
NoAnyLove 2017-09-20 22:04:38 +08:00 1
Python 本身的时区支持好像有问题,我之前遇到这个问题是直接用的第三方库,pendulum,https://github.com/sdispater/pendulum。简单,好用,
``` pendulum.now('Asia/Shanghai') |
7
NoAnyLove 2017-09-20 22:09:53 +08:00
Orz,不知道怎么按到 Enter 了,重新来。
``` import pendulum t1=pendulum.now('Asia/Shanghai') t2=t1.in_timezone('US/Hawaii') # 下面两个的输出绝对不一样 t1.strftime("%H") t2.strftime("%H") ``` |
8
GTim 2017-09-20 22:32:20 +08:00
@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 |
10
cevincheung OP @GTim #8 这样是 ok 了,好吧。replace 不能这么用。
但是好蛋疼啊。数据库里存的是 utf 时间戳,格式化显示的时候要根据用户浏览器、个人设置重新格式化,看来要弄个全局的 utils.timestamp_format 了 |
11
congminghaoxue92 2017-09-21 09:08:21 +08:00 1
arrow 大法好,建议用 arrow
http://arrow.readthedocs.io/en/latest/ |
12
blless 2017-09-21 09:14:43 +08:00
@GTim pytz 的 Asia/Shanghai 时区好像实际上会差 6 分钟。我现在都改成 dateutil.tz.gettz
|
13
cevincheung OP @blless #12 所以时区处理没有官方包?
|
14
ijophy 2017-09-21 13:00:55 +08:00
翻了翻文档,给下我的实现,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 |