微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

| 我有一个带有“开始时间”列的会议模型:
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当前是否可以从单个条目显示两个不同的时区值?     

解决方法

        取决于您要如何渲染。我先做一个模板标签,然后您可以放
{{ start_time|pdt_edt }}
之类的东西。此方法优于在类对象中定义函数的好处是,您可以将过滤器重新用于需要以两种格式打印的其他日期时间。 (例如,如果您的会议有结束时间;或者另一个对象有一个您希望以两种格式列出的时间)。 我建议从pytz开始处理(安装
easy_install.py pytz
)。 基本上,将应用程序的子目录
templatetags/
放在
__init__.py
中,另一个文件将其命名为tag7ѭ作为模板标签。 (基本程序 在您的模板中包括
{% 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)。 编辑:罕见的情况是,东部时间和太平洋时间不会减少3小时,但是pytz可以正确处理。
>>> from datetime import datetime
>>> import pytz
>>> ptz = pytz.timezone(\'US/Pacific\')
>>> etz = pytz.timezone(\'US/Eastern\')
>>> d = datetime(2011,3,13,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
    ,        您可以在模型中创建一个函数,该函数从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 }}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。