Python timedelta в годах - PullRequest
       48

Python timedelta в годах

115 голосов
/ 19 апреля 2009

Мне нужно проверить, прошло ли какое-то количество лет с той или иной даты. В настоящее время у меня есть timedelta из datetime модуля, и я не знаю, как преобразовать его в годы.

Ответы [ 14 ]

0 голосов
/ 19 октября 2009

Ну, вопрос кажется довольно простым. Вам нужно проверить количество «полных» лет, и только если оно равно 18, вам нужно беспокоиться о месяцах и днях. Крайний регистр: endDate.year - startDate.year == 18, и он делится на два случая: startDate.month != endDate.month и startDate.month == endDate.month, когда вам просто нужно проверить дни:

 def isOfAge(birthDate, age=18):
     endDate = date.today()
     years = endDate.year - birthDate.year
     if years == age:
         return (birthDate.month < endDate.month or 
                  (birthDate.month == endDate.month and birthDate.day < endDate.day))         
     return years > age

Это все еще больше, чем однострочная лямбда, но она все еще довольно коротка и кажется быстрой в исполнении.

0 голосов
/ 01 сентября 2009

эта функция возвращает разницу в годах между двумя датами (воспринимается как строки в формате ISO, но ее можно легко изменить в любом формате)

import time
def years(earlydateiso,  laterdateiso):
    """difference in years between two dates in ISO format"""

    ed =  time.strptime(earlydateiso, "%Y-%m-%d")
    ld =  time.strptime(laterdateiso, "%Y-%m-%d")
    #switch dates if needed
    if  ld < ed:
        ld,  ed = ed,  ld            

    res = ld[0] - ed [0]
    if res > 0:
        if ld[1]< ed[1]:
            res -= 1
        elif  ld[1] == ed[1]:
            if ld[2]< ed[2]:
                res -= 1
    return res
0 голосов
/ 03 июля 2009

Несмотря на то, что этот поток уже мертв, я мог бы предложить рабочее решение для той же самой проблемы, с которой я столкнулся. Вот оно (дата - строка в формате дд-мм-гггг):

def validatedate(date):
    parts = date.strip().split('-')

    if len(parts) == 3 and False not in [x.isdigit() for x in parts]: 
        birth = datetime.date(int(parts[2]), int(parts[1]), int(parts[0]))
        today = datetime.date.today()

        b = (birth.year * 10000) + (birth.month * 100) + (birth.day)
        t = (today.year * 10000) + (today.month * 100) + (today.day)

        if (t - 18 * 10000) >= b:
            return True

    return False
0 голосов
/ 19 апреля 2009

Насколько он вам нужен? td.days / 365.25 сблизит вас, если вы беспокоитесь о високосных годах.

...