我有以下情况:
– Postgres后端有一个字段
– Postgres后端有一个字段
timestamp without time zone
>在保存日期时间值之前,它看起来像:2014-09-29 06:00:00 00:00
>然后我从db加载相同的行,值为:2014-09-29 09:00:00
所以在数据库中,存储的日期不再是6AM ..但是9AM – 它在我当地时区转换.
我不明白发生了什么.为什么保存的日期转换为本地?
谢谢.
编辑
所以在@ univerio的回复后我尝试了一些东西:我从日期时间中删除了tzinfo
.replace(tzinfo = None)
现在日期保存正确 – 它不会调整到当地时间.我不太明白为什么所以我会暂时保留这个问题以防万一有人解释.
谢谢.
解决方法
我怀疑发生的是你正确存储感知日期时间,但是没有用时区读回它,因为列是WITHOUT TIME ZONE.每个Postgresql连接都有一个默认为系统时区的关联时区,因此当您检索特定的TIMESTAMP时,它将作为系统时区中的天真日期时间返回.出于这个原因,我总是建议存储TIMESTAMP WITH TIME ZONE.
如果要将sqlAlchemy中的连接时区更改为UTC,请在创建引擎时执行以下操作:
engine = create_engine("...",connect_args={"options": "-c timezone=utc"})
这应该让您将该值读回为UTC中的天真日期时间.
编辑:@Peter文档没有说明如何做到这一点;我不得不阅读几个不同的文档并连接点:
>关于connect_args
的sqlAlchemy文档,它允许您将参数直接传递给DBAPI connect()
> connect
上的psycopg2文档,它告诉您可以传递给libpq的额外参数
> options
参数上的libpq文档,允许您在与libpq连接时传递命令行选项
>有关-c
命令行开关的Postgresql文档,它允许您修改配置设置
>最后,关于您可以设置的timezone
客户端设置的Postgresql客户端文档