Python DRF使DateTimeField不考虑默认时区
默认时区为Python DRF使DateTimeField不考虑默认时区,python,django,datetime,serialization,django-rest-framework,Python,Django,Datetime,Serialization,Django Rest Framework,默认时区为时区='America/Chicago'和使用时区=假 在请求数据中,我有time字段,其值如下: '2017-04-05T14:42:52.472+05:00' 当我这样做的时候: serializer = self.get_serializer(data=data) if serializer.is_valid(): ... 该时间字段在已验证的\u数据中转换为该数据: 2017-04-05 09:42:52.472000 也就是说,它让时间变得天真。但是,它不考虑我
时区='America/Chicago'
和使用时区=假
在请求数据中,我有time
字段,其值如下:
'2017-04-05T14:42:52.472+05:00'
当我这样做的时候:
serializer = self.get_serializer(data=data)
if serializer.is_valid():
...
该时间字段在已验证的\u数据中转换为该数据:
2017-04-05 09:42:52.472000
也就是说,它让时间变得天真。但是,它不考虑我的默认时区。我希望它首先将时间转换为芝加哥时间,然后再将其简单化为:
2017-04-05 04:42:52.875000
就像django.utils.timezone.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
UnixTimestampField:
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
此时间戳表示zulu前5小时。因此,转换后的时间戳为:
2017-04-05 09:42:52.472000
已转换为UTC,此时间戳与UTC中的时间戳类似。
虽然时间戳是幼稚的,但它也是UTC,所以我不认为这是正确的
这本身就是一个问题
但是,它不考虑我的默认时区。我希望它会
首先将时间转换为芝加哥时间,然后使其简单化:
2017-04-05 04:42:52.875000
我相信这也是一种误解。原始时间戳,通过
+05:00
指示了它相对于哪个时区。你当地的时区不应该和它有任何关系
通常,处理时间戳的正确方法是尽快将其转换为UTC。然后尽可能长时间地保持UTC,并且仅在向用户显示时将其转换回时区表示形式。如果它们必须以时间偏移量存储,那么您开始使用的格式是一个不错的选择。您能在这里编写序列化程序类吗?@MohammadMustaqeem发布了它什么是UnixTimestampField
?它是从哪里进口的?@MohammadMustaqeem也发布了它。它只是从DateTimeField
继承,并覆盖到_表示
,感谢您的澄清!