2012-02-26 51 views
9

我正在Django中创建一个表单。我必须把输入类型字段,它只存储数据库中的时区(这将由用户从窗体中的下拉列表中选择)。我无法找到任何创建此时区模型的方法,以及它将如何根据保存的时区返回本地时间。我选择下面的领域,但它也存储分钟小时,第二也在Django中保存时区

timestamp = models.DateTimeField() 

下拉列表应在形式: ... GMT +5:30 GMT +6:00 ...等上。

回答

11

django和python都不提供一组时区供您使用。

为此,您将需要一个额外的模块,如pytz。你可以得到这样所有时区的列表:

>>> import pytz 
>>> pytz.all_timezones ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara', 
'Africa/Asmera'.... 

你可以自己存放在CharField的时区名称。

顺便说一句,通过“GMT +6:00”选择时区并不是一个好主意。例如,美国东部时间通常比格林威治标准时间晚5小时,但在夏令时变化周期为2周时,偏移量是不同的。同样,在一年中的某个时候,昆士兰的某个人和新南威尔士的某个人都有相同的GMT偏移量,但是因为新南威尔士州有DST,而昆士兰州没有,所以他们的GMT偏移量的半年不同。列出时区的唯一安全方法是列出实际的地理时区。

+0

我想在这样的地方要请跟随我的应用程序时,他/她跑这个应用程序必须在它的运行环境中有pytz吗? – 2012-02-26 16:24:23

4

我这样做的方式是使用pytz有效的时区名称。我调整我的名单只反映我需要的,即

TIMEZONES = (
    'Canada/Atlantic', 
    'Canada/Central', 
    'Canada/Eastern', 
    'Canada/Mountain', 
    'Canada/Pacific', 
) 

然后我有一个位置类设置时区作为一个字符字段为这样:

class Location(models.Model): 
    .... 
    time_zone = models.CharField(max_length=100, blank=True, null=True, choices=TIMEZONES) # 64 min 
    .... 

通知我设置空白&空设为True以使字段可选。看看django-timezone-field fields.py进一步的想法。

要我与pytz代码中使用此,我输入时区:

from pytz import timezone 
import datetime 
from locations.models import Location # my object that has the time_zone field 
loc = Location.objects.get(pk=1) #get existing location or your object that has time_zone field 
utc = pytz.utc 
some_utc_date = datetime.datetime(2002, 10, 27, 6, 0, 0).replace(tzinfo=utc) #tz aware 
some_date.astimezone(timezone(loc.time_zone)) 

更换datetime.datetime(2002,10,27,6,0,0)与对应于您所在位置的日期时间字段或具有time_zone字段的特定对象。在我的情况下,我将所有日期字段以UTC格式存储在MongoDB集合中。当我检索数据并想创建人类可读的输出时,我使用上述方法在输出中显示日期。您还可以创建自定义标签以在模板中处理此标签。有关更多详细信息,请参阅pytz文档。

0

我认为以上的回答都是非常好的,正确的,但是我在这里LEVE矿为简单的例子 ...

class UserProfile(models.Model): 

    import pytz 
    TIMEZONES = tuple(zip(pytz.all_timezones, pytz.all_timezones)) 

    # ... 
    timezone = models.CharField(max_length=32, choices=TIMEZONES, 
    default='UTC') 
# ...