小编典典

将 timedelta 转换为年?

all

我需要检查自某个日期以来是否已有几年。目前我已经timedeltadatetime模块中获得,我不知道如何将其转换为年。


阅读 113

收藏
2022-08-27

共1个答案

小编典典

你需要不止一个timedelta来判断已经过去了多少年;您还需要知道开始(或结束)日期。(这是闰年的事情。)

您最好的选择是使用dateutil.relativedelta object,但这是一个 3rd 方模块。如果您想知道从某个日期算起的datetime年份n(默认为现在),您可以执行以下操作:

from dateutil.relativedelta import relativedelta

def yearsago(years, from_date=None):
    if from_date is None:
        from_date = datetime.now()
    return from_date - relativedelta(years=years)

如果您宁愿坚持使用标准库,答案会稍微复杂一点::

from datetime import datetime
def yearsago(years, from_date=None):
    if from_date is None:
        from_date = datetime.now()
    try:
        return from_date.replace(year=from_date.year - years)
    except ValueError:
        # Must be 2/29!
        assert from_date.month == 2 and from_date.day == 29 # can be removed
        return from_date.replace(month=2, day=28,
                                 year=from_date.year-years)

如果是 2/29,而 18 年前没有 2/29,则此函数将返回 2/28。如果您宁愿返回 3/1,只需将最后一条return语句更改为::

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)

您的问题最初是说您想知道距某个日期已有多少年了。假设您想要整数年,您可以根据每年 365.2425
天进行猜测,然后使用yearsago上面定义的任一函数进行检查:

def num_years(begin, end=None):
    if end is None:
        end = datetime.now()
    num_years = int((end - begin).days / 365.2425)
    if begin > yearsago(num_years, end):
        return num_years - 1
    else:
        return num_years
2022-08-27