Python 将日期描述解析为日期本身

Python 将日期描述解析为日期本身,python,Python,需要从字符串中解析日期,该日期可以几种方式表示:“几秒钟前”、“14分钟前”、“1小时前”、“7小时前”、“1天前”、“2天前”、“1周前”、“3周前”、“4月16日09:44”、“今天09:44”、“昨天09:44” 试图解决此任务会导致非常冗长的代码。有没有更简洁优雅的方法来解析这样的字符串 下面的代码仅涵盖几个案例,以显示尝试。需要涵盖所有案例 import datetime def parse_date(item: str): params = item.strip().spl

需要从字符串中解析日期,该日期可以几种方式表示:“几秒钟前”、“14分钟前”、“1小时前”、“7小时前”、“1天前”、“2天前”、“1周前”、“3周前”、“4月16日09:44”、“今天09:44”、“昨天09:44” 试图解决此任务会导致非常冗长的代码。有没有更简洁优雅的方法来解析这样的字符串

下面的代码仅涵盖几个案例,以显示尝试。需要涵盖所有案例

import datetime

def parse_date(item: str):
    params = item.strip().split(' ')
    # print(params)
    if len(params) == 2:
        day, time = params
        if day == 'Today':
                date = datetime.date.today()
        elif day == 'Yesterday':
                date = datetime.date.today() - datetime.timedelta(days=1)
        else:
            print('Failed to resolve day:', item)
            return

        print(date)
        time = datetime.datetime.strptime(time, '%H:%M').time()
        return datetime.datetime.combine(date=date, time=time)

    elif len(params) == 3:
        day, month_hru, time = params
        day = int(day)
        months_map = {
            'January': 1,
            'February ': 2,
            'March': 3,
            'April': 4,
            'May': 5,
            'June': 6,
            'July': 7,
            'August': 8,
            'September': 9,
            'October': 10,
            'November': 11,
            'December': 12,
        }
        month = months_map.get(month_hru)
        if not month:
            print('Failed to resolve month:', item)
            return

        today = datetime.datetime.today()
        time = datetime.datetime.strptime(time, '%H:%M')
        print(month, day)
        return datetime.datetime(day=day, month=month, year=today.year, hour=time.hour, minute=time.minute)

    else:
        print('Failed to resolve date', item)
        return

parse_date("14 January 09:44")
parse_date("Yesterday 09:44")

不幸的是,没有办法概括你想要什么,因为这不是一个普遍的问题。您必须识别输入字符串属于哪个模式,并根据该模式的逻辑对其进行解析。如果您认为很难读取长函数,请将其拆分为不同的辅助函数,以处理每种情况。对于这些函数中的每一个,我将添加一个可选参数“now”来计算时间,假设
now
是一个固定时间,以帮助调试

您需要处理以下格式,我们将为每种格式定义一个函数

格式 作用 “几秒钟前”
parse_ago()
“14分钟前”、“1小时前”、“7小时前”、“1天前”、“2天前”、“1周前”、“3周前”
parse_ago()
“4月16日09:44”
parse_abs()
“今天09:44”,“昨天09:44”
parse_rel()

“几秒钟前”会被解析成什么?类似的东西是在库中实现的。正则表达式棒极了!