Зависит от того, как вы хотите это сделать.Я бы сделал templatetag , и тогда вы могли бы поставить такие вещи, как {{ start_time|pdt_edt }}
.Преимущество этого метода перед определением функций в объектах класса состоит в том, что вы можете повторно использовать фильтр для других дат, которые должны быть напечатаны в обоих форматах.(Например, если у вашей встречи было время окончания, или у другого объекта было время, которое вы хотели бы перечислить в обоих форматах).
Я бы предложил начать с pytz для обработки(install 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))
Вы также можете упростить шаблон, если знаете, что ваши настройки.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).
EDIT: редкий случай, когда восточное время и тихоокеанское время не отключаются на три часа, но 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