我试图找出某个特定事件是否发生"今天"在给定的时区。我的解决方案基于S.O上发布的其他问题,特别是How do I get the UTC time of "midnight" for a given timezone?。
该解决方案的基础是将午夜的UTC时间与事件的时间进行比较,但是我得到一个错误,即时间对象无法进行比较。
我午夜的方式如下
def midnight_today(timezone):
tz = pytz.timezone(timezone)
today = datetime.now(tz).date()
midnight = tz.localize(datetime.combine(today, time(0, 0)), is_dst=None)
return midnight.astimezone(pytz.utc)
我尝试
时出错if time_in > midnight:
print("Time-in is Today")
错误说明:
File "/home/shared/Projects/input_validation/validator/echotools.py", line 153, in is_checked_in
if time_in > midnight:
TypeError: can't compare offset-naive and offset-aware datetimes
如果我打印时间,我可以看到它们看起来不同
print(time_in, type(time_in)
2016-12-24 10:15:52.559365 <class 'datetime.datetime'>
print(midnight, type(midnight)
2016-12-23 22:00:00+00:00 <class 'datetime.datetime'>
所以我的午夜函数会返回一个偏移+00:00的时间,它将是UTC,而22:00 UTC确实是当地时间的午夜。
所以我觉得我如此接近解决方案,但只需要克服这个小障碍......
注意:我在Python 3.5中工作,不需要支持旧版本的Python。
编辑: 标记的重复问题/答案有帮助......但我仍然有一个问题。 (参考:How to make an unaware datetime timezone aware in python)
那里的答案提出,可以将时区初始时间转换为时区感知,或者反之亦然从感知时间戳中删除TZ信息。我试过了两种方法都有效。
所以我现在可以将midnight_today函数更改为:
def midnight_today(timezone):
tz = pytz.timezone(timezone)
today = datetime.now(tz).date()
midnight = tz.localize(datetime.combine(today, time(0, 0)), is_dst=None)
return midnight.astimezone(pytz.utc).replace(tzinfo=None)
否则我可以将比较线更改为
midnight = midnight_today(timezonename)
if timezone(timezonename).localize(time_in) > midnight:
print("Time-in is Today")
我的问题是围绕这些问题有什么问题 - 特殊日子的这些特殊考虑因素,例如什么时候应用DST?