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

Why is Django converting aware timestamp received from API request

我的 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 中手动定义的这种时区转换的默认方式,或者一起禁用它们?

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