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

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

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

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

编辑:谢谢你的建议,但试图调整时区似乎给我错误。所以我将在PG中使用不考虑时区的时间戳,并且总是插入using:

NOW() AT TIME ZONE 'UTC'

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


当前回答

我发现timezone.make_aware(datetime.datetime.now())在django中很有帮助(我在1.9.1)。不幸的是,你不能简单地让一个datetime对象感知偏移量,然后timez()它。你必须制定一个日期时间,并在此基础上进行比较。

其他回答

您是否尝试删除时区识别?

从http://pytz.sourceforge.net/

naive = dt.replace(tzinfo=None)

可能还得加上时区转换。

编辑:请注意这个答案的年龄。下面是一个涉及添加时区信息而不是在python3中删除它的答案。https://stackoverflow.com/a/25662061/93380

标题中对这个问题最直接的回答似乎缺失了:

naive_date.replace(tzinfo=aware_date.tzinfo) - aware_date

有什么紧迫的原因,为什么你不能处理年龄计算PostgreSQL本身?类似的

select *, age(timeStampField) as timeStampAge from myTable

我发现timezone.make_aware(datetime.datetime.now())在django中很有帮助(我在1.9.1)。不幸的是,你不能简单地让一个datetime对象感知偏移量,然后timez()它。你必须制定一个日期时间,并在此基础上进行比较。

我想到了一个超简单的解决办法:

import datetime

def calcEpochSec(dt):
    epochZero = datetime.datetime(1970,1,1,tzinfo = dt.tzinfo)
    return (dt - epochZero).total_seconds()

它既适用于时区感知型datetime值,也适用于时区无知型datetime值。并且不需要额外的库或数据库解决方案。