如何在用户的时区中比较SQLAlchemy UTC日期?

时间:2014-01-11 18:04:47

标签: 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)
    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')

问题是这个查询遇到了月末边缘情况。我需要在用户本地时间的上下文中查询事件。我不能走另一条路,将用户的月份边界转换为UTC,就像当前编写的那样,因为产生的歧义导致特殊情况下出现更多错误,例如:夏令时的界限。

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

0 个答案:

没有答案