python timezone conversion issues using pytz
我正在使用pytz进行日期时间转换,但在大约上午8点EST DST处于活动状态的情况下,pytz会显示意外数据。
1 2 | eight_35 = datetime.now(pytz.timezone('US/Eastern')) # assume today's 8:35AM EST eight_am = datetime(eight_35.year, eight_35.month, eight_35.day, 8, 0, 0, 0, tzinfo=pytz.timezone('US/Eastern')) |
我注意到虽然
如果我转换为UTC,我会得到以下结果:
1 2 | eight_35.astimezone(pytz.utc) >>> 12:35PM UTC eight_am.astimezone(pytz.utc) >>> 12:56PM UTC |
我的代码应该检查用户是否已登录任何超过美国东部时间上午8点的东西。 Django在创建查询集时自动转换为UTC。
1 2 3 4 | UserLoginLog.objects.create(user=user, date_login=now) date logged is 12:35PM UTC # this will result in no items because eight_am is translated as 12:56PM UserLoginLog.objects.filter(user=user, date_login__gte=eight_am) |
如您所见,用户在上午8:35登录,所以如果我在上午8点之后获得所有日志
处理它的最佳方法是什么,以便我可以检测夏令时但仍然能够准确地比较数据?
-
datetime.now(pytz.timezone('US/Eastern')) - 正确 -
datetime(..same time.., tzinfo=pytz.timezone('US/Eastern')) - 不正确
请参阅此答案,了解为什么不应将
如果更改了有意识的日期时间对象(以便生成的时间可能具有不同的utc偏移量),则应调用
你们都很有帮助! 所以我所做的就是制作类似的东西
1 2 3 4 5 6 7 | @staticmethod def est_localize(datetime_object): # remove tzinfo new_datetime = datetime_object.replace(tzinfo=None) # finally, localize the datetime new_datetime = pytz.timezone('US/Eastern').localize(new_datetime) return new_datetime |
以及我创建的每个日期时间对象,我将它们全部包装在
1 2 | eight_35 = datetime.now(pytz.timezone('US/Eastern')) # assume today's 8:35AM EST eight_am = est_localize(datetime(eight_35.year, eight_35.month, eight_35.day, 8)) |