Python 日期时间字符串解析:如何知道解析了什么?
Python Datetime string parsing: How to know what has been parsed?
我想使用 Python 来解析用户输入的字符串,并且需要知道指定了日期的哪一部分,例如,
"Jan. 2017"
=> 月 = 1,年 = 2017
结果应该告诉我字符串中只指定了月份和年份,并且 return 这些值,同时:
"2003-05-01"
指定年月日。
我尝试使用 dateutil.parser.parse
,并给了它一个罕见的默认日期值。例如,1900/01/01
,然后将解析结果与默认日期进行比较并查看差异。但是如果解析结果中的月或者日都是1
,
它需要使用不同的默认值再进行一轮解析,以排除它是默认值或来自用户输入的可能性。
上面的方式看起来很古怪。有没有一个库可以让我解析常用的日期字符串格式并知道解析了什么?
我最终采用了古怪的方式:
from dateutil.parser import parse
# parse the date str, and return day/month/year specified in the string.
# the value is None if the string does not have information
def parse_date(date_str):
# choose two different dates and see if two parsed results
default_date1 = datetime.datetime(1900, 1, 1, 0, 0)
default_date2 = datetime.datetime(1901, 12, 12, 0, 0)
year = None
month = None
day = None
try:
parsed_result1 = parse(date_str, default=default_date1)
parsed_result2 = parse(date_str, default=default_date2)
if parsed_result1.year == parsed_result2.year: year = parsed_result2.year
if parsed_result1.month == parsed_result2.month: month = parsed_result2.month
if parsed_result1.day == parsed_result2.day: day = parsed_result2.day
return year, month, day
except ValueError:
return None, None, None
我想使用 Python 来解析用户输入的字符串,并且需要知道指定了日期的哪一部分,例如,
"Jan. 2017"
=> 月 = 1,年 = 2017
结果应该告诉我字符串中只指定了月份和年份,并且 return 这些值,同时:
"2003-05-01"
指定年月日。
我尝试使用 dateutil.parser.parse
,并给了它一个罕见的默认日期值。例如,1900/01/01
,然后将解析结果与默认日期进行比较并查看差异。但是如果解析结果中的月或者日都是1
,
它需要使用不同的默认值再进行一轮解析,以排除它是默认值或来自用户输入的可能性。
上面的方式看起来很古怪。有没有一个库可以让我解析常用的日期字符串格式并知道解析了什么?
我最终采用了古怪的方式:
from dateutil.parser import parse
# parse the date str, and return day/month/year specified in the string.
# the value is None if the string does not have information
def parse_date(date_str):
# choose two different dates and see if two parsed results
default_date1 = datetime.datetime(1900, 1, 1, 0, 0)
default_date2 = datetime.datetime(1901, 12, 12, 0, 0)
year = None
month = None
day = None
try:
parsed_result1 = parse(date_str, default=default_date1)
parsed_result2 = parse(date_str, default=default_date2)
if parsed_result1.year == parsed_result2.year: year = parsed_result2.year
if parsed_result1.month == parsed_result2.month: month = parsed_result2.month
if parsed_result1.day == parsed_result2.day: day = parsed_result2.day
return year, month, day
except ValueError:
return None, None, None