首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres+SQLAlchemy在使用default=func.now()时将时间转换为UTC

Postgres+SQLAlchemy在使用default=func.now()时将时间转换为UTC
EN

Stack Overflow用户
提问于 2015-07-30 04:16:42
回答 1查看 14.5K关注 0票数 12

我已经定义了一个SQLAlchemy表

代码语言:javascript
复制
foo_table = Table('foo', metadata,
    Column('id', Integer, primary_key=True),
    Column('created_on', DateTime, default=func.now()),
    ...
)

它在Postgres中创建一个表。

代码语言:javascript
复制
CREATE TABLE foo
(
  id serial NOT NULL,
  created_on timestamp without time zone,
  ...
)

本地时区被正确设置(检查Python的datetime.datetime.now()显示我的本地时间),但是每当我在foo_table中插入一行而没有显式设置created_on时,所用的时间是当前的UTC,而不是我的本地时间(例如“2015-07-2916:38:08.112192”)。

当我尝试手动设置created_on时,这一切都很好,但当将时间留给func.now()分配时间戳时,Postgres或SQLAlchemy似乎正在将时间转换为UTC。

如何才能让SQLAlchemy或Postgres只使用当前的本地时间创建记录?

EN

回答 1

Stack Overflow用户

发布于 2015-07-30 07:23:33

这里的关键部分是列created_on被定义为“没有时区的时间戳”。

在这里的文件中:

http://www.postgresql.org/docs/current/static/datatype-datetime.html

在已被确定为没有时区的时间戳的文字中,PostgreSQL将无声地忽略任何时区指示。也就是说,结果值是从输入值中的日期/时间字段派生出来的,不对时区进行调整。 对于带有时区的时间戳,内部存储的值总是以UTC (通用协调时间,传统上称为格林尼治标准时间,GMT)为单位。指定了显式时区的输入值将使用该时区的适当偏移量转换为UTC。如果输入字符串中没有指定时区,则假定它位于由系统的TimeZone参数指示的时区,并使用时区的偏移量将其转换为UTC。

因此,实际上,您正在丢弃时区信息,只剩下存储的UTC日期。

在SQLAlchemy的情况下,要创建具有“带有时区的时间戳”的列,需要添加以下内容:

DateTime(timezone=True)

根据这里的文件:

basics.html

这应该可以让您保存您想要的时区信息,并检索它。

希望这有助于回答你的问题,让你上路。祝你好运。=)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31715078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档