Как лучше всего отобразить значение EDT и PDT из одного значения времени с помощью Python / Django? - PullRequest
1 голос
/ 24 июня 2011

У меня есть модель собрания со столбцом времени начала:

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 ]

1 голос
/ 24 июня 2011

Зависит от того, как вы хотите это сделать.Я бы сделал 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
0 голосов
/ 24 июня 2011

Вы можете создать функцию в своей модели, которая рассчитывает время PDT по времени EDT, и использовать ее в своем шаблоне, как и любое другое поле вашей модели:

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 }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...