我timestamptz在 PostgreSQL 中有一个时区感知字段。当我从表中提取数据时,我想现在减去时间,这样我就可以得到它的年龄。
timestamptz
我遇到的问题是两者datetime.datetime.now()似乎datetime.datetime.utcnow()都返回了不知道时区的时间戳,这导致我收到此错误:
datetime.datetime.now()
datetime.datetime.utcnow()
TypeError: can't subtract offset-naive and offset-aware datetimes
有没有办法避免这种情况(最好不使用第三方模块)。
编辑:感谢您的建议,但是尝试调整时区似乎给了我错误..所以我将在 PG 中使用时区不知道的时间戳,并始终使用以下方法插入:
NOW() AT TIME ZONE 'UTC'
这样我所有的时间戳默认都是UTC(即使这样做更烦人)。
您是否尝试过消除时区意识?
来自http://pytz.sourceforge.net/
naive = dt.replace(tzinfo=None)
可能还需要添加时区转换。
编辑:请注意这个答案的年龄。下面是一个涉及添加时区信息而不是在 python 3中删除它的答案
正确的解决方案是添加时区信息,例如,将当前时间作为 Python 3 中的感知日期时间对象:
from datetime import datetime, timezone now = datetime.now(timezone.utc)
在较旧的 Python 版本上,您可以utc自己定义 tzinfo 对象(日期时间文档中的示例):
utc
from datetime import tzinfo, timedelta, datetime ZERO = timedelta(0) class UTC(tzinfo): def utcoffset(self, dt): return ZERO def tzname(self, dt): return "UTC" def dst(self, dt): return ZERO utc = UTC()
然后:
now = datetime.now(utc)