首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在django中获取用于日期比较的本地时区日期时间

如何在django中获取用于日期比较的本地时区日期时间
EN

Stack Overflow用户
提问于 2014-09-03 18:25:34
回答 1查看 1.1K关注 0票数 1

我试图根据用户时区发送一个提醒。用户时区为“美国/纽约”。

我试图为用户争取以下方面的时间:

代码语言:javascript
复制
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。它是从customer对象收集的,如下所示:

代码语言:javascript
复制
 reminder = customer.reminder #set to 13:00

然后,我想发送一个提醒,如果在10分钟+或-提醒。

我做了这样的比较:

代码语言:javascript
复制
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)

这些指纹:

代码语言:javascript
复制
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点。

为什么即使我本地化了now_plus_10和now_minus_10日期,但它们不转换为New_York时间,这会使它们像提醒一样13:00,然后触发提醒?

EN

回答 1

Stack Overflow用户

发布于 2014-09-03 22:02:45

我想你误解了localize()的工作。(我假设您是在讨论pytz localize(),在这种情况下,您可以看到文档这里。)

它不转换时间,它需要一个天真(时区-不知情)的日期时间,并使它知道(分配给它一个时区)。下面是您的示例中发生的事情:

代码语言:javascript
复制
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直接在时区之间进行转换,您可以这样做:

代码语言:javascript
复制
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都不鼓励您手动本地化和转换时区。您必须检查文档,但是基本上Django方法是这样的:

  • 所有内部日期时间都是时区感知的,并且使用UTC。
  • 使用django.utils.timezone.now()获取UTC的当前时间。
  • 用户输入的日期时间(例如,如果用户在表单中输入他或她的提醒时间)将自动被告知。要做到这一点,您必须知道用户的时区,然后调用activate()。您也可以使用localtime()手动完成此操作。
  • 使用这些UTC日期时间进行所有比较和算术。

我绝对建议你用Django的方式做事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25651184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档