Python datetime 时区转换大坑

背景:
从数据库获取了时间

cursor = db.cursor()
cursor.execute('select ts from xxx order by id desc limit 1')
data1 = cursor.fetchall()
my_time = data1[0][0]

my_time 是个 datetime 类型
需要和当前时间作对比

cn_zone = pytz.timezone('Asia/Shanghai')
def get_cur_time():
    return datetime.datetime.now(cn_zone)

# 直接减会报错
# can't subtract offset-naive and offset-aware datetimes
get_cur_time() - my_time

考虑转换成 timestamp 再计算
大坑开始!
my_time 由于开始是个无时区的 datetime,无论用各种方法都无法改变其 timestamp 的值。

猜测是其生成的时候,timestamp 已经确定了,后续无法改变。

另:
转换时区的时候有另一个坑:

https://www.cnblogs.com/ajianbeyourself/p/11982529.html

下面这样用,会把时区变为 LMT+0806(多八小时零六分)

cn_zone = pytz.timezone('Asia/Shanghai')
my_time.replace(cn_zone)

正确用法:
用 datetime 相减,但要用 localize 来纠正

ltime = cn_zone.localize(my_time)

# 这样再减就可以了
(get_cur_time() - ltime).seconds

你可能感兴趣的:(python)