python - DRF 使 DateTimeField 变得简单,而不考虑默认时区

标签 python django datetime serialization django-rest-framework

默认时区为 TIME_ZONE = 'America/Chicago'USE_TZ = False

在请求数据中,我有 time 字段,其值如下所示:

'2017-04-05T14:42:52.472+05:00'

当我这样做时:

serializer = self.get_serializer(data=data)
if serializer.is_valid():
    ...

该时间字段在 validated_data 内转换为:

2017-04-05 09:42:52.472000

也就是说,它让时间变得天真。但是,它没有考虑我的默认时区。我希望它首先将时间转换为芝加哥时间,然后使其天真:

2017-04-05 04:42:52.875000

就像django.utils.timezone.make_naive()的工作原理一样。

我正在通过使用 make_naive 来解决这个问题。但是,我认为这不是一个好的解决方案。

序列化器:

class LocationSerializer(serializers.ModelSerializer):
    time = UnixTimestampField()

    class Meta:
        model = Location
        fields = (
            'latitude',
            'longitude',
            'time'
        )

    def validate(self, attrs):
        user = self.context['request'].user
        if user.is_authenticated():
            attrs['tracking_id'] = user.tracking.id
            attrs['device_id'] = user.current_device.id
        return attrs

UnixTimestamp字段:

class UnixTimestampField(serializers.DateTimeField):
    def to_representation(self, value):
        if not value:
            return value

        return int(value.timestamp())

这是 DRF 的默认行为吗?解决这个问题的正确方法是什么?

最佳答案

所以我认为您对时间戳的含义有误解。

2017-04-05T14:42:52.472+05:00

此时间戳表示比祖鲁语早 5 小时。所以转换后的时间戳为:

2017-04-05 09:42:52.472000

已转换为 UTC,并且此时间戳看起来像我期望的 UTC 格式。 虽然时间戳很幼稚,但它也是 UTC,所以我不认为这是在 这本身就是一个问题。

However, it is not considering my default timezone. I would expect it to convert the time to Chicago time first and then make it naive to this:

我相信这也是一个误解。原始时间戳,通过 +05:00 表示它相对于哪个时区。您本地的时区应该与它没有任何关系。

一般来说,处理时间戳的正确方法是尽快将它们转换为 UTC。然后尽可能长时间地将它们保留为 UTC,并且仅在向用户显示时将它们转换回时区表示形式。如果它们必须以时间偏移量存储,那么您开始使用的格式是一个很好的方法。

关于python - DRF 使 DateTimeField 变得简单,而不考虑默认时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43228009/

相关文章:

python - ipython 服务器无法启动 : No module named notebook. notebookapp

python - 避免程序在 I/O 错误时退出

python - os.path.abspath的一个 super 奇怪的bug

django - 带有随 secret 码的Redis AUTH

django - 为什么 Django 实际上不将更改写入测试数据库

ios - 在 iPhone 中响应夏令时

C# - Convert.ToDateTime(),其中日期中未指定年份

python - 如何通过使用多个文件在 Python 中正确使用多处理?

python - 超时不工作 django-redis-cache

python - 仅在一天结束之前查找数据框列的平均值(日期时间索引)