SqlAlchemy在保存之前将UTC DateTime转换为本地时间

时间:2014-09-29 17:42:32

标签: python datetime sqlalchemy

我有以下情况:   - Postgres后端有一个字段

timestamp without time zone
  • 在保存日期时间值之前,它看起来像:2014-09-29 06:00:00 + 00:00
  • 然后我从数据库加载相同的行,其值为:2014-09-29 09:00:00

所以在数据库中,存储的日期不再是6AM ..但是9AM - 它在我当地的时区转换。

我不明白发生了什么。为什么保存的日期转换为本地?

感谢。

修改

所以在@ univerio回复之后我尝试了一些东西:我从日期时间中删除了tzinfo

.replace(tzinfo = None) 

现在日期保存正确 - 它不会将其调整到当地时间。我不太明白为什么所以如果有人有解释我现在就打开这个问题。

感谢。

2 个答案:

答案 0 :(得分:22)

我怀疑发生的事情是您正确存储了感知datetime,但没有使用时区读取它,因为列是WITHOUT TIME ZONE。每个PostgreSQL连接都有一个默认为系统时区的关联时区,因此当您检索特定的TIMESTAMP时,它会在系统的时区中以天真datetime的形式返回。出于这个原因,我总是建议存储TIMESTAMP WITH TIME ZONE

如果要将SQLAlchemy中的连接时区更改为UTC,请在创建引擎时执行以下操作:

engine = create_engine("...", connect_args={"options": "-c timezone=utc"})

这应该让你以UTC中的天真datetime读取该值。

编辑:@Peter文档没有明白如何做到这一点;我不得不阅读几个不同的文档并连接点:

  1. 关于connect_args的SQLAlchemy文档,它允许您将参数直接传递给DBAPI connect()
  2. connect上的psycopg2文档,它告诉您可以传递给libpq的额外参数
  3. options参数上的libpq文档,允许您在与libpq连接时传递命令行选项
  4. 关于允许您修改配置设置的-c命令行开关的PostgreSQL文档
  5. 最后,关于您可以设置的timezone客户端设置的PostgreSQL客户端文档

答案 1 :(得分:0)

这很有帮助,但是在使用 flask 和 mysql+pymysql 或 mysql+mysqldb 时 唯一有效的东西

{"connect_args": {"init_command": "SET time_zone = '+00:00'"}} 您可以在适当的驱动程序连接中检查引擎参数,即 site-packages/pymysql/connections.py