如何获得当地时区日期时间在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做事情。

+0

如何本地化相对于用户时区的13:00的提醒?谢谢您的帮助! – Atma 2014-09-03 23:12:45

+0

@Atma ::如果你的意思是手动的,用pytz,'user_tz。本地化(提醒)'会使它具有时区意识,然后你可以将它与你的时区感知当前时间进行比较。如果使用Django的时区支持,您可以调用'activate(user_tz)',然后从表单中返回的提醒时间或数据库将具有时区感知和准确性。 – 2014-09-04 01:45:10