在Django模型中节省时区



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

 timestamp = models.DateTimeField()

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

我认为上面的答案都是正确的,但我把我的答案留在这里作为一个简单的例子。。。

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')
# ...

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小时,但在夏令时变化前后的两周内,偏移量有所不同。此外,在一年中的某些时候,昆士兰的人和新南威尔士州的人都有相同的GMT偏移量,但由于新南威尔士州有夏令时,而昆士兰没有,所以在半年的时间里,他们的GMT偏移是不同的。列出时区的唯一安全方法是列出实际的地理时区。

django时区字段是一个很好地处理这一问题的应用程序。

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

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

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

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

注意我设置为空白&null设置为True,使该字段可选。请查看django时区字段.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字段的特定对象相对应的datetime字段。在我的例子中,我将所有日期字段以UTC格式存储在MongoDB集合中。当我检索数据并想要创建人类可读的输出时,我使用上面的方法在输出中显示日期。您也可以创建一个自定义标记来处理模板中的此问题。请参阅pytz文档了解更多详细信息。

如果要从pytz迁移到zoneinfo:

try:
    import zoneinfo
except ImportError:
    from backports import zoneinfo
class UserProfile(models.Model):  
    TIMEZONE_CHOICES = ((x, x) for x in sorted(zoneinfo.available_timezones(), key=str.lower))
    timezone = models.CharField("Timezone", choices=TIMEZONE_CHOICES, max_length=250, default='Etc/GMT+2')

相关内容

  • 没有找到相关文章

最新更新