唉。。。写篇blog纪念一下浪费了我半个上午时间的问题。。。
写的是这么一个代码:

1
while pre.time != now.time:

pre是从数据库取出来的一条记录,now是我准备插入的一条记录,.timedatetimeField,对应程序里就是一个datetime对象。
结果这个条件怎么都是真的,也就是说pre.timenow.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 我就觉得它很不靠谱,接着就查到了其他的问题。。。

  1. 比如一个字符串Sun, 28 Aug 2016 11:42:00 +0200其实最后是带着时区的,那么怎么转换成 aware time呢?方案是:

    1
    2
    from datetime import datetime
    date_published = datetime.strptime(date_published, "%a, %d %b %Y %H:%M:%S %z")

    看起来很棒棒啊!我就想直接给我的字符串也带上时区: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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from datetime import datetime, timedelta, tzinfo
ZERO_TIME_DELTA = timedelta(0)
LOCAL_TIME_DELTA = timedelta(hours=8) # 本地时区偏差
class LocalTimezone(tzinfo):
"""实现北京时间的类"""
def utcoffset(self, dt):
return LOCAL_TIME_DELTA
def dst(self, dt):
return ZERO_TIME_DELTA
def tzname(self, dt):
return '+08:00'
forma = "%Y-%m-%d %H:%M"
now.time = datetime.strptime(time_str, forma).replace(tzinfo=LocalTimezone())

update:实际上import pytz就是最佳的解决方案,为了避开这个库而写的代码都很挫。。。