使用Python / Django从单个时间值显示EDT和PDT值的最佳方法是什么?

时间:2011-06-23 20:29:04

标签: django

我有一个带有开始时间列的会议模型:

class Meeting(mode.Model):
    name = models.CharField(max_length=100)
    start = models.DateTimeField()

我的时区设置为TIME_ZONE = 'America/Toronto'

我目前正在输入当时的EDT值。在我的模板中,我想显示EDT和PDT值,例如:

| Name          | Start        |
| First Meeting | 10:00 AM PDT |
|               |  1:00 PM EDT |

Django目前是否可以在单个条目中显示两个不同的时区值?

2 个答案:

答案 0 :(得分:1)

取决于您希望如何渲染。我会制作一个templatetag,然后你就可以放{{ start_time|pdt_edt }}之类的东西了。此方法优于在类对象中定义函数的好处是,您可以将过滤器重用于需要以两种格式打印的其他日期时间。 (例如,如果您的会议有结束时间;或者另一个对象有时间您希望以两种格式列出)。

我建议从pytz开始处理(安装easy_install.py pytz)。

基本上,将名为templatetags/的应用的子目录放在__init__.py中,将另一个文件称为time_zone_display.py,用于模板标记。 (基本程序

在您的模板中包含

{% load time_zone_display %}
...  
{{ start_time|pdt_edt }}

time_zone_display.py之类的

from django import template
from django.utils.safestring import mark_safe
from datetime import datetime, time

register = template.Library()
@register.filter
def pdt_edt(some_date):
    if type(some_date) not in (datetime, time):
        return "Template ERROR: Not a datetime" 
    else:
        your_time = pytz.timezone(settings.TIME_ZONE)
        d = your_time.localize(some_date)
        pdt = pytz.timezone('US/Pacific')
        edt = pytz.timezone('US/Eastern')
        d_pdt = d.astimezone(pdt).strftime('%I:%M %p %Z')            
        d_edt = d.astimezone(edt).strftime('%I:%M %p %Z')
        return mark_safe("%s<br />%s" % (d_pdt, d_edt))

如果您知道您的settings.TIME_ZONE将始终是太平洋时间的固定偏移(3小时),您也可以简化模板,那么您可以执行以下操作:

from django import template
from django.utils.safestring import mark_safe
from datetime import datetime, time, timedelta

register = template.Library()
@register.filter
def pdt_edt(some_date):
    if type(some_date) not in (datetime, time):
        return "Template ERROR: Not a datetime" 
    else:
        d_edt = some_date.strftime("%H:%M %p EDT")
        d_pdt = (some_date - timedelta(0,3*60*60)).strftime("%H:%M %p PDT")
        return mark_safe("%s<br />%s" % (d_pdt, d_edt))

(虽然EDT / PDT只是白天节省时间的正确缩写;所以第一种方法更好地认为它需要安装pytz)。


编辑:东部时间和太平洋时间没有关闭3小时的罕见情况,但是pytz可以正确处理。

>>> from datetime import datetime
>>> import pytz
>>> ptz = pytz.timezone('US/Pacific')
>>> etz = pytz.timezone('US/Eastern')
>>> d = datetime(2011,3,13, 3, 30) # 3:30 am on March 13th,2011 when daylights savings started this year
>>> print d.astimezone(etz).strftime('%m/%d/%Y %I:%M %p %z')
03/13/2011 03:30 AM EDT
>>> print d.astimezone(ptz).strftime('%m/%d/%Y %I:%M %p %z')
03/12/2011 11:30 PM PST

答案 1 :(得分:0)

您可以在模型中创建一个从EDT时间计算PDT时间的函数,并像模型的任何其他字段一样在模板中使用它:

class Meeting(models.Model)
    name = models.CharField(max_length=100)
    start = models.DateTimeField()

    def start_PDT(self):
        # example using 'pytz' module
        # `start` is already in EDT timezone
        PDT = pytz.timezone('US/Pacific')
        return self.start.astimezone(pytz.PDT)

在模板中:

{{ meeting.start_PDT }}