小编典典

不能减去偏移天真和偏移感知日期时间

all

timestamptz在 PostgreSQL 中有一个时区感知字段。当我从表中提取数据时,我想现在减去时间,这样我就可以得到它的年龄。

我遇到的问题是两者datetime.datetime.now()似乎datetime.datetime.utcnow()都返回了不知道时区的时间戳,这导致我收到此错误:

TypeError: can't subtract offset-naive and offset-aware datetimes

有没有办法避免这种情况(最好不使用第三方模块)。

编辑:感谢您的建议,但是尝试调整时区似乎给了我错误..所以我将在 PG 中使用时区不知道的时间戳,并始终使用以下方法插入:

NOW() AT TIME ZONE 'UTC'

这样我所有的时间戳默认都是UTC(即使这样做更烦人)。


阅读 90

收藏
2022-03-22

共1个答案

小编典典

您是否尝试过消除时区意识?

来自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 对象(日期时间文档中的示例):

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)
2022-03-22