Python 如何比较用户&x27;中的SQLAlchemy UTC日期;什么时区?
我正在尝试获取要在用户本地时间的日历上显示的事件。所有日期都以UTC格式存储在Postgres中 这里是事件模型和问题中的查询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
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
数据库是否存在相同的问题。