我有以下情况: - Postgres后端有一个字段
timestamp without time zone
所以在数据库中,存储的日期不再是6AM ..但是9AM - 它在我当地的时区转换。
我不明白发生了什么。为什么保存的日期转换为本地?
感谢。
修改
所以在@ univerio回复之后我尝试了一些东西:我从日期时间中删除了tzinfo
.replace(tzinfo = None)
现在日期保存正确 - 它不会将其调整到当地时间。我不太明白为什么所以如果有人有解释我现在就打开这个问题。
感谢。
答案 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文档没有明白如何做到这一点;我不得不阅读几个不同的文档并连接点:
connect_args
的SQLAlchemy文档,它允许您将参数直接传递给DBAPI connect()
connect
上的psycopg2文档,它告诉您可以传递给libpq的额外参数options
参数上的libpq文档,允许您在与libpq连接时传递命令行选项-c
命令行开关的PostgreSQL文档timezone
客户端设置的PostgreSQL客户端文档答案 1 :(得分:0)
这很有帮助,但是在使用 flask 和 mysql+pymysql 或 mysql+mysqldb 时 唯一有效的东西
{"connect_args": {"init_command": "SET time_zone = '+00:00'"}} 您可以在适当的驱动程序连接中检查引擎参数,即 site-packages/pymysql/connections.py