mysql插入并选择后,Python datetime失去时区意识

时间:2018-08-15 04:50:16

标签: python datetime

我有一段代码,用于存储向mysql数据库运行报告的时间/日期,以便以后可以稍后将其读回并确保至少在2个小时后才能再次运行报告请求。问题是保存到mysql并返回时我失去了时区意识。例如,当我尝试计算从当前时间到last_run时间的增量时间时,我得到错误信息“ TypeError:无法减去天真的偏移时间和知道偏移的日期时间”。这很有道理,但我不知道如何解决。所有时间实际上都是UTC,所以我没有时区差异。 1)我可以将datetime.now(timezone.utc)转换为不知道的日期吗? 2)当我将last_run时间保存到mysql中时,可以保留时区意识吗?

减去错误的代码

time_since_last_request = datetime.now(timezone.utc) - last_run

在数据库中设置“ last_run”的代码

current_time=datetime.now(timezone.utc)
cursor.execute("UPDATE tbl_rpt_log SET last_run=%s, report_id=%s where user=%s", (current_time, ReportID, ,user))
db.commit()

代码,该代码在减法失败之前回读last_run时间

cursor.execute("SELECT * FROM tbl_rpt_log")
reports_to_run = cursor.fetchall()  

for row in reports_to_run :
  last_run=(row[4])
  time_since_last_request = datetime.now(timezone.utc) - last_run

1 个答案:

答案 0 :(得分:1)

此变量可识别时区:

datetime.now(timezone.utc)

这不是:

last_run = (row[4])

在这种情况下,您可以使用

将时区信息添加到后者
last_run = row[4].astimezone(timezone.utc)
last_run = row[4].replace(tzinfo=timezone.utc)  # if db is already in UTC

完整的示例变为

cursor.execute("SELECT * FROM tbl_rpt_log")
reports_to_run = cursor.fetchall()  

for row in reports_to_run :
  last_run = row[4].astimezone(timezone.utc)
  time_since_last_request = datetime.now(timezone.utc) - last_run