我有一个带有开始时间列的会议模型:
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目前是否可以在单个条目中显示两个不同的时区值?
答案 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)。
>>> 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 }}