我这样做的方法是使用 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
....
请注意,我将空白和 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))
将 datetime.datetime(2002, 10, 27, 6, 0, 0) 替换为与您的位置或具有 time_zone 字段的特定对象相对应的日期时间字段。就我而言,我将所有日期字段以 UTC 格式存储在 MongoDB 集合中。当我检索数据并想要创建人类可读的输出时,我使用上述方法在输出中显示日期。您还可以创建自定义标签来在模板中处理此问题。有关详细信息,请参阅pytz doc。