无法减去偏移无知和偏移知晓的日期时间

2024-04-19 00:41:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

编辑:谢谢你的建议,但是试图调整时区似乎给了我错误。。所以我将在PG中使用不知道时区的时间戳,并始终使用:

NOW() AT TIME ZONE 'UTC'

这样我所有的时间戳在默认情况下都是UTC(尽管这样做更烦人)。


Tags: 数据datetimepostgresql错误时间情况cannow
3条回答

你试过删除时区感知吗?

来自http://pytz.sourceforge.net/

naive = dt.replace(tzinfo=None)

可能还需要添加时区转换。

编辑:请注意这个答案的年龄。下面是Python3的答案。

正确的解决方案是添加时区信息,例如,在Python 3中获取当前时间作为一个感知的datetime对象:

from datetime import datetime, timezone

now = datetime.now(timezone.utc)

在较旧的Python版本上,您可以自己定义utctzinfo对象(来自datetime文档的示例):

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)

我知道有些人特别使用Django作为接口来抽象这种数据库交互。Django提供了可用于此目的的实用程序:

from django.utils import timezone
now_aware = timezone.now()

您确实需要设置一个基本的Django设置基础结构,即使您只是使用这种类型的接口(在设置中,您需要包含USE_TZ=True以获得一个感知的日期时间)。

就其本身而言,这可能远远不足以激励您使用Django作为一个界面,但还有许多其他好处。另一方面,如果你在这里绊倒是因为你弄坏了你的Django应用程序(就像我一样),那么也许这会有帮助。。。

相关问题 更多 >