Python 如何比较用户&x27;中的SQLAlchemy UTC日期;什么时区?

Python 如何比较用户&x27;中的SQLAlchemy UTC日期;什么时区?,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我正在尝试获取要在用户本地时间的日历上显示的事件。所有日期都以UTC格式存储在Postgres中 这里是事件模型和问题中的查询 from datetime import datetime, timedelta from dateutil import tz ... class Event(TimestampMixin, db.Model): __tablename__ = 'events' id = db.Column(db.Integer, primary_key=True

我正在尝试获取要在用户本地时间的日历上显示的事件。所有日期都以UTC格式存储在Postgres中

这里是事件模型和问题中的查询

from datetime import datetime, timedelta
from dateutil import tz
...

class Event(TimestampMixin, db.Model):
    __tablename__ = 'events'

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    title = db.Column(db.String(100))
    start_date_utc = db.Column(UtcDateTime)
    end_date_utc = db.Column(UtcDateTime)

    user = db.relationship('User', backref=db.backref('posted_events', lazy='dynamic'))

    ...

    def events_for(self, year, month):
        this_month = datetime(year, month, 1).replace(tzinfo=self.user.tz)
        next_month = this_month + relativedelta(day=1, months=1)
        # TODO: Fix this potential timezone bug -- compare using the user's timezone
        this_month_utc = this_month.astimezone(tz.tzutc())
        next_month_utc = next_month.astimezone(tz.tzutc())
        return self.events \
            .filter(Event.start_date_utc >= this_month_utc) \
            .filter(Event.start_date_utc < next_month_utc) \
            .order_by(Event.start_date_utc, Event.id)

class User(Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)

    ...

    @property
    def tz(self):
        return tz.gettz('EST')
从datetime导入datetime,timedelta
从dateutil导入
...
类事件(TimestampMixin,db.Model):
__tablename_uu='events'
id=db.Column(db.Integer,主键=True)
user\u id=db.Column(db.Integer,db.ForeignKey('users.id'))
title=db.Column(db.String(100))
开始日期utc=db.列(UtcDateTime)
结束日期utc=db.列(UtcDateTime)
user=db.relationship('user',backref=db.backref('posted_events',lazy='dynamic'))
...
def事件(自身、年、月):
此月=日期时间(年、月、1)。替换(tzinfo=self.user.tz)
下个月=本月+相对LTA(日=1,月=1)
#TODO:修复此潜在的时区错误--使用用户的时区进行比较
本月utc=本月astimezone(tz.tzutc())
下个月utc=下个月.astimezone(tz.tzutc())
返回自我事件\
.filter(Event.start\u date\u utc>=本月\u utc)\
.filter(Event.start\u date\u utc
问题是,此查询遇到了月末边缘情况。我需要在用户的本地时间上下文中查询事件。我不能走另一条路,将用户的月份边界转换为UTC,就像它当前编写的那样,因为在特殊情况下(例如夏令时边界)会导致更多的错误


如何更改此查询以在时区上下文中进行比较?

您如何将用户的月份边界转换为UTC?这导致了什么样的错误?因为这正是我要做的:在用户的时区中创建一个
datetime()
对象,将其扩展到从第一天到最后一天的月份,然后在查询中使用它(在查询中它将被自动解释为UTC,IIRC)。@MartijnPieters我刚刚调整了代码。这有帮助吗?你在时区使用
pytz
吗?我已经用
tz
进行了本地测试。添加了用户模型的一部分以获得更多的上下文。我询问的原因是
pytz
时区信息比
datetime
预期的更广泛,每个时区都有历史DST信息和偏移量,这意味着
datetime(年、月、1)。替换(tzinfo=self.User.tz)
可能导致错误的时间和日期;您应该在timezone对象上使用一个方法,将正确的偏移量应用于
datetime
对象。我不确定
dateutil.tz
数据库是否存在相同的问题。