我有一段代码,用于存储向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
答案 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