Django为什么要转换从API请求接收的感知时间戳

时间:2019-10-20 09:09:32

标签: django datetime timezone django-timezone

我的Django应用收到POST API请求,该请求的正文中的字段之一包含已知的时间戳。如果我在反序列化后立即记录它的值,我会看到相同的时间戳,但时区不同。

以下是提交的请求正文的示例:

{
    "event_timestamp": "2019-11-08T15:00:00+02:00",
    ...
}

但是,如果我尝试在通过反序列化后立即记录该字段的值,我会看到:

> print(validated_data['event_timestamp'])

2019-11-08 14:00:00+01:00

TZ已启用并配置为CEST时区:

USE_TZ = True
TIME_ZONE = 'Europe/Vienna'

我可以假设Django将自动将接收到的时间戳转换为整个项目的已定义时区,但是这种转换的结果将给我相同的结果:

2019-11-08T15:00:00+02:00 represented as CEST timezone is 2019-11-08T15:00:00+02:00

但是相反,我看到转换为2019-11-08 14:00:00+01:00,这是伦敦的时区。

我知道这种转换是Django处理已知日期时间对象的正常过程,但是为什么它将接收的值转换为既未设置为项目本身默认值又与接收的时间戳没有任何关系的时区?

是否可以管理在settings.py中手动定义的时区转换或将其全部禁用的默认转换方式?

1 个答案:

答案 0 :(得分:1)

您的时区不是CEST,而是Europe/Vienna。夏令时结束于2019年10月27日,因此11月8日的时区偏移量为+01:00。因此Django可以正确转换时区。