Python datetime 时区转换大坑

336 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天

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

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 已经确定了,后续无法改变。

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

www.cnblogs.com/ajianbeyour…

下面这样用,会把时区变为 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