Python datetime在mysql插入和选择后失去时区感知

Python datetime loses timezone awareness after mysql insert and select

我有一段代码存储报告运行到mysql数据库的时间/日期,以便稍后我可以回读它并确保它再次运行报告请求至少2小时。 问题是我在保存到mysql并返回时失去了时区感知。 例如,当我尝试将deltatime从当前时间计算到last_run时,我得到了错误'TypeError:无法减去offset-naive和offset-aware datetimes。' 这是有道理的,但我不知道如何解决。 所有的时间实际上都是UTC所以我没有时区差异。 1)我可以将datetime.now(timezone.utc)转换为无意识的日期吗? 2)当我将last_run时间保存到mysql中时,我可以保留时区感知吗?

执行减法的代码错误

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

在数据库中设置'last_run'的代码

1
2
3
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时间的代码

1
2
3
4
5
6
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
datetime.now(timezone.utc)

而这不是:

1
last_run = (row[4])

在这种情况下,您可以使用后者添加时区信息

1
2
last_run = row[4].astimezone(timezone.utc)
last_run = row[4].replace(tzinfo=timezone.utc)  # if db is already in UTC

完整的例子变成了

1
2
3
4
5
6
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