在Django模型中保存时区

Ami*_*Pal 17 python django timezone django-models

我正在Django中创建一个表单.我必须输入一个输入类型字段,该字段仅存储数据库中的时区(用户将从表单下拉列表中选择).我无法找到创建此时区模型的任何方法,以及它将如何根据保存的时区返回本地时间.我选择了以下字段,但它也存储了分钟和秒

 timestamp = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)

下拉列表应采用以下形式:... GMT +5:30 GMT +6:00 ......依此类推.

kdt*_*kdt 19

django和python都没有为你提供一组时区.

为此,您需要一个额外的模块,如pytz.您可以获得所有时区的列表,如下所示:

>>> import pytz
>>> pytz.all_timezones ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara',
'Africa/Asmera'....
Run Code Online (Sandbox Code Playgroud)

您可以将时区名称存储在a中CharField.

顺便说一句,选择时区"GMT +6:00"并不是一个好主意.例如,EST通常比GMT晚5个小时,但在夏令时变化的2周内,偏移量不同.此外,在一年中的某些时候,昆士兰州和新南威尔士州的某些人都有相同的GMT抵消,但由于新南威尔士州有DST而昆士兰没有,因此半年的GMT抵消额不同.列出时区的唯一安全方法是列出实际的地理时区.


ypr*_*rez 10

django-timezone-field是一个很好地处理这个问题的应用程序.


Sli*_*eam 8

我认为以上答案都是正确的,但我在这里仅举一个简单的例子 ...

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')
# ...
Run Code Online (Sandbox Code Playgroud)


rad*_*tek 6

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

TIMEZONES = (
    'Canada/Atlantic',
    'Canada/Central',
    'Canada/Eastern',
    'Canada/Mountain',
    'Canada/Pacific',
)
Run Code Online (Sandbox Code Playgroud)

然后我有一个位置类,它将时区设置为Char Field,如下所示:

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

注意我将空白&null设置为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))
Run Code Online (Sandbox Code Playgroud)

将datetime.datetime(2002,10,27,6,0,0)替换为与您的位置或具有time_zone字段的特定对象对应的datetime字段.在我的例子中,我将所有日期字段以UTC格式存储在MongoDB集合中.当我检索数据并想要创建人类可读输出时,我使用上面的方法在输出中显示日期.您还可以创建自定义标记以在模板中处理此问题.有关详细信息,请参阅pytz doc.