Python3 怎么格式化时间(时区问题)

2017-09-20 19:54:07 +08:00
 cevincheung
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'))

为毛两个输出是一样的?

3337 次点击
所在节点    Python
15 条回复
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
petelin
2017-09-20 20:43:52 +08:00
时间的比较应该在同一个时区下. 还有 replace 有坑, 使用 tzc.localize 更好
cevincheung
2017-09-20 21:34:54 +08:00
@petelin #2 关键是 python 输出个时间要这么麻烦吗?
cevincheung
2017-09-20 21:36:16 +08:00
@petelin #1 py3.5.2 表示两个输出一毛一样
cevincheung
2017-09-20 21:39:22 +08:00
@petelin #1
NoAnyLove
2017-09-20 22:04:38 +08:00
Python 本身的时区支持好像有问题,我之前遇到这个问题是直接用的第三方库,pendulum,https://github.com/sdispater/pendulum。简单,好用,

```
pendulum.now('Asia/Shanghai')
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")
```
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')
```
cevincheung
2017-09-21 05:01:25 +08:00
@NoAnyLove #7 所以说不是我理解有问题对不对
@GTim #8 我试试
cevincheung
2017-09-21 05:03:44 +08:00
@GTim #8 这样是 ok 了,好吧。replace 不能这么用。

但是好蛋疼啊。数据库里存的是 utf 时间戳,格式化显示的时候要根据用户浏览器、个人设置重新格式化,看来要弄个全局的 utils.timestamp_format 了
congminghaoxue92
2017-09-21 09:08:21 +08:00
arrow 大法好,建议用 arrow
http://arrow.readthedocs.io/en/latest/
blless
2017-09-21 09:14:43 +08:00
@GTim pytz 的 Asia/Shanghai 时区好像实际上会差 6 分钟。我现在都改成 dateutil.tz.gettz
cevincheung
2017-09-21 11:01:03 +08:00
@blless #12 所以时区处理没有官方包?
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)
cevincheung
2017-09-21 13:09:38 +08:00
@ijophy #14 就没有一个全局设置么?

比如 php date_default_timezone_set('Asia/Chongqing') 之后代码 date 全是这个时区的时间

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

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

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

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

© 2021 V2EX