python'x days ago'到datetim

2024-04-27 13:51:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下格式的日期字符串:

x minutes/hours/days/months/years ago

我需要使用python将其解析为datetime。

看来dateutil做不到。

有办法吗?


Tags: 字符串datetime格式agodaysdateutil办法hours
3条回答

这可以通过^{}s轻松完成:

import datetime

def string_to_delta(string_delta):
    value, unit, _ = string_delta.split()
    return datetime.timedelta(**{unit: float(value)})

生产:

>>> string_to_delta("20 hours ago")
datetime.timedelta(0, 72000)

虽然这将需要一些额外的工作来处理月/年-因为将月添加到日期是一个含糊不清的操作,但如果您知道它的含义,它应该是一个简单的添加。

要获得实际时间,只需从^{}中去掉delta。

你当然可以。你只需要一个^{}

s = "3 days ago"
parsed_s = [s.split()[:2]]
time_dict = dict((fmt,float(amount)) for amount,fmt in parsed_s)
dt = datetime.timedelta(**time_dict)
past_time = datetime.datetime.now() - dt

另外,看起来^{}有一个relativedelta,它的作用类似于一个timedelta,但是构造函数也接受参数中的monthsyears(显然参数需要是整数)。

因为你的论点是2天前,3个月前,2年前。下面的函数可以帮助获取参数的确切日期。您首先需要导入以下日期实用程序

import datetime
from dateutil.relativedelta import relativedelta

然后实现下面的功能

def get_past_date(str_days_ago):
    TODAY = datetime.date.today()
    splitted = str_days_ago.split()
    if len(splitted) == 1 and splitted[0].lower() == 'today':
        return str(TODAY.isoformat())
    elif len(splitted) == 1 and splitted[0].lower() == 'yesterday':
        date = TODAY - relativedelta(days=1)
        return str(date.isoformat())
    elif splitted[1].lower() in ['hour', 'hours', 'hr', 'hrs', 'h']:
        date = datetime.datetime.now() - relativedelta(hours=int(splitted[0]))
        return str(date.date().isoformat())
    elif splitted[1].lower() in ['day', 'days', 'd']:
        date = TODAY - relativedelta(days=int(splitted[0]))
        return str(date.isoformat())
    elif splitted[1].lower() in ['wk', 'wks', 'week', 'weeks', 'w']:
        date = TODAY - relativedelta(weeks=int(splitted[0]))
        return str(date.isoformat())
    elif splitted[1].lower() in ['mon', 'mons', 'month', 'months', 'm']:
        date = TODAY - relativedelta(months=int(splitted[0]))
        return str(date.isoformat())
    elif splitted[1].lower() in ['yrs', 'yr', 'years', 'year', 'y']:
        date = TODAY - relativedelta(years=int(splitted[0]))
        return str(date.isoformat())
    else:
        return "Wrong Argument format"

然后可以这样调用函数:

print get_past_date('5 hours ago')
print get_past_date('yesterday')
print get_past_date('3 days ago')
print get_past_date('4 months ago')
print get_past_date('2 years ago')
print get_past_date('today')

相关问题 更多 >