正确的日期转换方式

时间:2018-12-21 13:00:14

标签: python django

我在一个字段中可以选择车辆保修。他们可以选择1年,2年和结束基准。

当我从数据库中获得它时,它是未编码的。

当我print(car['warranty'])时得到2019-12-20T08:59:49.897Z"

当我做print(type(car["warranty"]))时,我得到<type 'unicode'>

我该如何转换它并检查它是一个日期还是一个或其他日期。取决于我要显示的标签:

  • 如果要显示日期,请输入:在formatted_date之前有效
  • 如果要显示的数字是: 2年保修

我使用python 2.7。

更新

我从数据库中获取数据,如下所示:

item = Item.objects.get(pk=lead.item_id)
lead_data = json.loads(item.data, object_hook=json_util.object_hook)

warranty = (lead_data['sale']['warranty_end'] if lead_data['sale']['warranty'] == '0' else get_warranty_label(str(lead_data['sale']['warranty']))) if 'sale' in lead_data else get_warranty_label('1'),

更新

lead_data['sale']如下:

{u'warranty': u'0', u'comment': u'', u'financing': u'NO', u'waranty_end': u'2019-12-30', u'usageDescription': u'', u'price': u'15000', u'financing_amount': u'0', u'label': u'', u'delivery': u'2018-12-21', u'warranty_end': u'2019-12-20T08:59:49.897Z"', u'deposit': u'0', u'kilometers': u'13000', u'usage': u'NO', u'deliveryText': u'2018-12-21', u'take_over': u'0', u'warranty_endText': u'20/12/2019', u'id': u'2af7bfe2-252f-4482-857f-8b03e28c748b', u'vat': u'21'}

5 个答案:

答案 0 :(得分:1)

看看dateutil.parsedatetime也可能有用。

from dateutil.parser import parse

def is_date(object):
    try:
        #Check if it's a date of any format.
        parse(object)
        return 'Valid until formated_date'
    except ValueError:
        #When cannot be a date
        return '2 year warranty'

答案 1 :(得分:0)

要将第一个结果转换为DateTime对象,请使用->

import datetime

date_object = datetime.datetime.strptime("2019-12-20T08:59:49.897Z", '%Y-%m-%dT%H:%M:%S.%fZ')
temp_date = date_object.date() # returns date
# then convert to date.
str(temp_date) # result '2019-12-20'

答案 2 :(得分:0)

您的日期采用Java / JSON中常见的ISO样式格式。最后的Z表示它是UTC日期时间;您很可能希望将其转换为您当地的时间。要将其转换为Python中的datetime对象,应使用datetime模块。这里的datetime模块具有三个主要的关注类别:datetime.datetime,datetime.date和datetime.time,它们分别表示日期和时间,分别是日期和时间。

每个方法都有fromisoformat()的方法,该方法可以接受ISO样式的字符串,但不幸的是,仅从python 3.7起可用...

相反,我们必须使用方法strptime,在稍微修改字符串之后,该方法将接受字符串和格式化字符串。我将假设我们希望我们的datetime对象保持对时区的了解,以便稍后可以在选定的时区中输出datetime,但是不幸的是strptime不会接受Z指定符(因此,我们需要修改字符串。

此外,在低于3.2的python版本中,即使传递了它可以识别的指定时区,strptime也不会产生“ aware”对象(对时区的了解)。因此,要正确执行此操作,我们必须遍历这个相当复杂的事情:

def process_datestring(my_date_string):

    # In Python 3, a UTC class exists
    import datetime
    try:
        from datetime import timezone
        utc = timezone.utc
    except ImportError:
        # Python 2
        class UTC(datetime.tzinfo):
            def utcoffset(self, dt):
                return datetime.timedelta(0)

            def tzname(self, dt):
                return "UTC"

            def dst(self, dt):
                return datetime.timedelta(0)
    utc = UTC()

    # If we have a Z-terminated datetime string,
    # trim off the Z and build a UTC datetime object
    if my_date_string and my_date_string[-1] == 'Z':
        my_datetime = datetime.datetime.strptime(
            my_date_string[:-1], '%Y-%m-%dT%H:%M:%S.%f')
        my_datetime.replace(tzinfo=UTC())
        # Use this newly-created datetime object as you see fit
        return 'Valid until formated_date'

    # Otherwise, test for a simple date

    try:
        # Convert a string of form YYYY-MM-DD to a datetime object
        my_datetime = datetime.datetime.strptime(
             my_date_string, '%Y-%m-%d')
        # This datetime object is naive - it is NOT timezone aware
        return 'Valid until formated_date'
    except ValueError:
        # Unable to convert this string - perhaps it is a number?
        try:
            # This will raise an exception if my_date_string is not
            # a simple number
            float(my_date_string)
            return '2 years warranty'
        except ValueError:
            # Not a number either; most likely an unhandled date format.
            raise ValueError('Unhandled string!')

my_date_string = "2019-12-20T08:59:49.897Z"
print(process_datestring(my_date_string))
# returns 'Valid until formated_date'
my_date_string = "2019-12-20"
print(process_datestring(my_date_string))
# returns 'Valid until formated_date'
my_date_string = "3"
print(process_datestring(my_date_string))
# returns '2 years warranty'
my_date_string = "test"
print(process_datestring(my_date_string))
# raises ValueError 'Unhandled string!'

答案 3 :(得分:0)

您也可以尝试以下代码。

from datetime import datetime

def is_date(s):
    try:
        d = datetime.strptime(s, "%Y-%m-%dT%H:%M:%S.%fZ")   

        if type(d) is datetime:
            return True
        else:
            return False
    except:
        return False

s = "2019-12-20T08:59:49.897Z"
print(is_date(s)) # True

s2 = "2019-12-20T08:59"
print(is_date(s2)) # False

在Python的交互式控制台上理解上述步骤:

>>> from datetime import datetime
>>>
>>> s = "2019-12-20T08:59:49.897Z"
>>> type(s)
<class 'str'>
>>>
>>> d = datetime.strptime(s, "%Y-%m-%dT%H:%M:%S.%fZ")
>>> d
datetime.datetime(2019, 12, 20, 8, 59, 49, 897000)
>>>
>>> type(d)
<class 'datetime.datetime'>
>>>
>>> type(d) is datetime
True
>>>
>>> type(d) is str
False
>>>
>>> type(d) is int
False
>>>
>>> type(d) is list
False
>>>
>>> type(d) is tuple
False
>>>
>>> type(d) is dict
False
>>>
>>> type(d) is float
False
>>>
>>> type(d) is complex
False
>>>

答案 4 :(得分:0)

有一个更老的库可以完全满足您的要求iso8601。它解析ISO8601格式化的日期时间字符串(这就是您所拥有的)。经过十多年的严格测试。但是,正如该库上的自述文件所述,python-dateutil还将解析ISO8601字符串以及更多内容。