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 |