我在一个字段中可以选择车辆保修。他们可以选择1年,2年和结束基准。
当我从数据库中获得它时,它是未编码的。
当我print(car['warranty'])
时得到2019-12-20T08:59:49.897Z"
当我做print(type(car["warranty"]))
时,我得到<type 'unicode'>
。
我该如何转换它并检查它是一个日期还是一个或其他日期。取决于我要显示的标签:
我使用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'}
答案 0 :(得分:1)
看看dateutil.parse。 datetime也可能有用。
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字符串以及更多内容。