如何比较给定时区的午夜时间与UTC时间戳

时间:2016-12-24 11:57:00

标签: python datetime

我试图找出某个特定事件是否发生"今天"在给定的时区。我的解决方案基于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?

0 个答案:

没有答案