我正在尝试获取要在用户当地时间显示在日历上的事件。所有日期都以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,就像当前编写的那样,因为产生的歧义导致特殊情况下出现更多错误,例如:夏令时的界限。
如何在时区的上下文中更改此查询以进行比较?