唉。。。写篇blog纪念一下浪费了我半个上午时间的问题。。。
写的是这么一个代码:
1 | while pre.time != now.time: |
pre
是从数据库取出来的一条记录,now
是我准备插入的一条记录,.time
是datetimeField
,对应程序里就是一个datetime
对象。
结果这个条件怎么都是真的,也就是说pre.time
和now.time
总是不相等,我输出了一下发现pre.time
是utc时间而且最后会带一个+00:00
。
想到以前看到过的warning其实很好查到。now.time
是一个 naive time,而pre.time
是一个 aware time,其实就是带不带时区的问题,所以只要让now.time
带上时区变成 aware time 就可以了。
然后就去查怎么变,其实第一个查到的就是对的。。。只是代码给的不全导致我产生了误解。。。查到的代码是:
1 | aware_time = naive_time.replace(tzinfo=utc) |
写进去就显示 unresolved reference 我就觉得它很不靠谱,接着就查到了其他的问题。。。
- 比如一个字符串
Sun, 28 Aug 2016 11:42:00 +0200
其实最后是带着时区的,那么怎么转换成 aware time呢?方案是:
1 | from datetime import datetime |
看起来很棒棒啊!我就想直接给我的字符串也带上时区:time_str += u' +0800'
,然后再用这个方法岂不是美滋滋?
结果就是一直 not match 。%z %Z +08:00 utc+8 都试了,甚至还查到了CCT啥的,还是不行。。。SO要给我精神损失费啊TAT
2. attribute ‘tzinfo’ of ‘datetime.datetime’ objects is not writable
题主写的是 book.creationTime.tzinfo = EST
答主说改成 book.creationTime = book.creationTime.replace(tzinfo=EST)
我一想这人有点傻啊,但是他能用EST
我也能用吧,反正加上了时区一切好说,大不了我再加加减减调整一下。。。大概是aware_time = naive_time.replace(tzinfo=EST)
很显然还是不行TAT
最终解决方案:看这些查到的代码我一直以为既然有tzinfo这个类,应该就会有实现好的类,然而问这些的人可能都import pytz
了。。。所以如果不想加上pytz实际上最佳的方案就是实现一个tzinfo的类。
1 | from datetime import datetime, timedelta, tzinfo |
update:实际上import pytz
就是最佳的解决方案,这些方法实在是太挫了。。。