使用pytz的python时区转换问题

时间:2015-04-08 13:43:35

标签: python django python-3.x django-1.7 pytz

我使用pytz进行日期时间转换,但在8月EST DST有效的情况下,pytz会显示意外数据。

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'))

我注意到虽然eight_35tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>eight_amtzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>,但我不确定哪一个是正确的。

如果我转换为UTC,我会得到以下结果:

eight_35.astimezone(pytz.utc) >>> 12:35PM UTC
eight_am.astimezone(pytz.utc) >>> 12:56PM UTC

我的代码应该检查用户是否已经登录了大于上午8点的东西。 Django在创建查询集时会自动转换为UTC。

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点之后获得所有日志 处理它的最佳方法是什么,以便我可以检测夏令时但仍能准确比较数据?

2 个答案:

答案 0 :(得分:2)

  • datetime.now(pytz.timezone('US/Eastern')) - 正确
  • datetime(..same time.., tzinfo=pytz.timezone('US/Eastern')) - 不正确

请参阅this answer,了解为什么不应将tzinfo参数与pytz时区一起使用,这些时区可能在不同时间具有不同的utc偏移。

.now(tz)在内部使用UTC时间(tz.fromutc(utc_time)),因此它允许时区选择与给定时间对应的正确utc偏移量。

如果更改了知晓的日期时间对象(以便生成的时间可能具有不同的utc偏移量),那么您应该调用dt = tz.normalize(dt)来获取正确的tzinfo。请参阅Localized times and date arithmetic

答案 1 :(得分:0)

你们都很有帮助!所以我所做的就是制作像

这样的东西
@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

以及我创建的每个日期时间对象,我将它们全部包装在est_localize()内,包括我必须使用的+timedelta()+relativedelta()。只要我将它们包裹在est_localize()内,所有都被正确翻译。谢谢大家!

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))