【问题标题】:convert string to timezone iso format in python在python中将字符串转换为时区iso格式
【发布时间】:2019-07-13 07:49:59
【问题描述】:

我正在尝试将具有此表单 "2019-07-17T16:00:50.282203+01:30" 的字符串转换为时区格式,以便我可以更新 models.DateTimeField 字段。

models.py:

from django.utils import timezone

class task(models.Model):
       title = models.CharField(max_length=100)
       create_date = models.DateTimeField(default=timezone.now)
       .
       .
       .

请求将是这样的:

{
    "title": "editeddd task",
    "create_date" : "2019-07-17T16:00:50.282203+01:30"

}

卡在转换 UTC 部分。

view.py:

.
.
.
create_date = datetime.strptime(self.request.data['expiration_date'], '%Y-%m-%dT%H:%M:%S.%f%z')
.
.

‍‍错误是针对%z部分。它可以转换"2019-07-17T16:00:50.282203+0130",但不能转换"2019-07-17T16:00:50.282203+01:30"(在UTC部分注意:

【问题讨论】:

    标签: python type-conversion timezone


    【解决方案1】:

    当您引用 request.data 时,看起来您使用的是 Django REST 框架。在这种情况下,最直接的方法是使用 DRF 的序列化程序来解析/验证传入的数据。

    from rest_framework import serializers
    
    class TaskSerializer(serializers.ModelSerializer):
        class Meta:
            model = Task
            fields = ('title', 'create_date')
    
    

    如果您只想检索经过验证的数据,您可以这样做:

    >>> serializer = TaskSerializer(data=request.data)
    >>> serializer.is_valid(raise_exception=True)
    >>> serializer.validated_data
    OrderedDict([('title', 'editeddd task'), ('create_date', datetime.datetime(2019, 7, 17, 14, 30, 50, 282203, tzinfo=<UTC>))])
    
    

    或者如果你想保存一个新任务:

    task = serializer.save()
    

    验证所有传入数据并通过访问request.POSTrequest.data 手动验证每个字段很重要,这往往容易出错。 DRF 的序列化程序(或 Django 的表单)有很多预先构建的逻辑,使任务变得更加容易和安全。

    【讨论】:

      【解决方案2】:

      在发送时要严格,在接收时要宽容,在将它传递给 strptime 之前,您应该对该 create_date 字符串进行一些字符串修改。

      我的建议是使用正则表达式,或者查看rreplace - How to replace the last occurrence of an expression in a string? 以摆脱最后一个:

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2015-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-09
        • 2021-01-11
        • 2015-12-10
        • 2015-04-27
        • 1970-01-01
        相关资源
        最近更新 更多