python中pytz,东8区,6分钟问题

使用datetime直接构造时间的时候,设置时区是没有北京时间的,一般来说习惯了linux的同志都会默认用上海时间来代替,这里却有一个问题,如果要进行时区转换,上海时间比北京时间差6分钟。。。

比如:

tz = pytz.timezone('Asia/Shanghai')
t = datetime.datetime(2015, 9, 5, 9, 0, 0, 0, tzinfo=tz)

这样打印出来得到的时间是:
2015-09-07 09:00:00+08:06

在django框架中,貌似from django.utils.timezone import localtime的这个localtime会修正那6分钟,这问题就来了,要自己在程序里构造时间,并且跟用这个localtime转化的时间对比的时候巨麻烦。

解决方法:

tz = pytz.timezone('Asia/Shanghai')
t = datetime.datetime(start_time.year, start_time.month, start_time.day, 9, 0, 0, 0)
t = tz.localize(t)


这样打印出来的就没有那个讨厌的:06了。
2015-09-07 09:00:00+08:00

timothyqiu :
实际上不用这么麻烦,造成 6 分钟的原因是添加时区信息时使用了错误的方式。按照官方文档,使用 tz.localize(datetime.datetime(2015, 9, 5, 9)) 可以得到正确的结果。
老楠 Reply to timothyqiu :
不是很明白,你这解决方法跟本文文末的解决方法区别是什么?我看起来好像几乎是一样的。
游客1 :
谢谢老楠,我原来是用的 if datetime.datetime.now(tz) > datetime.datetime.strptime(planstartat, '%Y-%m-%d %H:%M:%S').replace(tzinfo=tz): 发现总是有个6分钟在搞怪,看了你的文章fix了。
老楠 Reply to 游客1 :
u r welcome.
jack.li :
在做时间的计算时如果有转换时区后的这个时间参与那么+08:06会导致问题,网上相关的解答目前只看到楼主这一篇,感谢!
For example, "name@something.com". If someone replies to you it will be via email.
For example, "http://someaddress.com"