django models.DateTimeField()时间总是少1小时

ar7v8xwq  于 2023-10-21  发布在  Go
关注(0)|答案(2)|浏览(139)

下面是我的django模型的部分代码。模型类。如果我在管理面板中设置例如17.03.2018 14:00它正确保存此模型与正确的日期和时间。但是如果我打印结果,它返回一个小时少17.03.2018 13:00。我该怎么补救?

...
starts_at = models.DateTimeField()
...

beginnt_date = json.dumps(starts_at.date().strftime("%d-%m-%Y"), cls=DjangoJSONEncoder)
beginnt_zeit = json.dumps(starts_at.time().strftime("%H:%M"), cls=DjangoJSONEncoder)
result = []
result.append({
    'beginnt_date': beginnt_date,
    'beginnt_zeit': beginnt_zeit,
})

print(result)    
>>> [{'beginnt_date':"17-03-2018", 'beginnt_zeit':"12:38"}]
eanckbw9

eanckbw91#

Django将表单中的日期时间解释为 * 当前时区 *,在您的情况下是Europe/Zurich。所有的日期时间都是saved to the database作为UTC,这是一个小时后。所以你在print语句中看到的是以UTC为单位的时间。
更改显示的时区的正常方法是使用timezone.activate(),这会影响模板的排序(以及其他)。如果你正在创建一个API,你通常希望坚持使用UTC
如果你想转换datetime对象,你可以使用pytz,Django的一个必需依赖项:

from pytz import timezone

starts_at_local = starts_at.astimezone(timezone("Europe/Zurich"))
print(starts_at_local.time().strftime("%H:%M"))  # should be what you're expecting
piv4azn7

piv4azn72#

我也有一个问题,我的时间总是被关闭1小时,但这是因为我已经设置了TIME_ZONE = 'MST'在我的settings.py文件。我把它改成了TIME_ZONE = 'America/Denver',解决了这个问题。似乎更长的名字自动占夏令时。
在我努力解决我的off-by-1错误时,我发现了这一点。虽然它没有直接回答我的问题,但Kevin回答的Europe/Zurich部分提供了一个线索,我想与未来的读者分享我的解决方案。

相关问题