如何获得当地时区日期时间在Django的日期比较
问题描述:
我试图根据用户时区提醒。用户时区是“美国/纽约”如何获得当地时区日期时间在Django的日期比较
我尝试用下面来获取用户的时间:
now = datetime.now()
now_plus_10 = test_customer.time_zone.localize(now + timedelta(minutes = 10))
now_minus_10 = test_customer.time_zone.localize(now + timedelta(minutes = -10))
提醒时间是13:00。它是从客户对象聚集这样的:
reminder = customer.reminder #set to 13:00
然后我想送如果在10分钟+或在提醒 - 提醒的。
我喜欢的比较:
if reminder > now_minus_10 and gb_real_time < now_plus_10:
reminder_email.send()
else:
print 'ceiling '+str(now_plus_10)
print 'not in window don t send'
print 'floor '+str(now_minus_10)
此打印:
ceiling 2014-09-03 10:10:54.547901-04:00
not in window don t send
floor 2014-09-03 09:50:54.547901-04:00
我在时区: '美国/洛杉矶' 中,它是10:00
为什么是否即使我本地化了now_plus_10和now_minus_10日期,但是它们不会转换为New_York时间,这会使它们像提醒一样是13:00,然后触发提醒?
答
我想你已经误解了localize()
的功能。 (我假设你在谈论的pytz localize()
,在这种情况下,你可以看到文档here。)
它不转换时间,它需要一个天真的(时区,不知道)日期时间,并使其认识(分配它是一个时区)。这里是发生了什么事情在你的榜样:
now = datetime.now() # 10:00am local time (no timezone)
later = now + timedelta(minutes=10) # 10:10am (no timezone)
now_plus_10 = ny_timezone.localize(later) # 10:10am (NY timezone)
如果你真的想直接时区之间进行转换,使用pytz
,你可以做这样的事情:
now = la_timzeone.localize(datetime.now()) # 10:00am local time (LA timezone)
later = now + timedelta(minutes=10) # 10:10am (LA timezone)
later_safe = la_timezone.normalize(later) # because of DST and such
later_ny = later_safe.astimezone(ny_timezone) # 13:10 (NY timezone)
later_ny_safe = ny_timezone.normalize(later_ny) # again
现在,这很复杂!这就是为什么pytz
和Django都不希望手动本地化和转换时区。你必须检讨documentation,但基本上Django的做法是这样的:
- 所有内部日期时间的时区感知和使用UTC。使用
django.utils.timezone.now()
以UTC获得当前时间。 - 用户输入日期时间(例如,如果您的用户在表单中输入他或她的提醒时间)会自动发现。要做到这一点,你必须知道用户的时区,然后致电
activate()
。你也可以手动使用localtime()
。 - 用这些UTC日期时间进行所有的比较和算术运算。
我绝对推荐用Django做事情。
如何本地化相对于用户时区的13:00的提醒?谢谢您的帮助! – Atma 2014-09-03 23:12:45
@Atma ::如果你的意思是手动的,用pytz,'user_tz。本地化(提醒)'会使它具有时区意识,然后你可以将它与你的时区感知当前时间进行比较。如果使用Django的时区支持,您可以调用'activate(user_tz)',然后从表单中返回的提醒时间或数据库将具有时区感知和准确性。 – 2014-09-04 01:45:10