Python: calcolare l'età di un utente

Python: calcolare l'età di un utente

In questo articolo vedremo come calcolare l'età di un utente a partire dalla sua data di nascita con Python.

Il primo criterio da stabilire è il formato della data. Stabiliamo di usare il formato standard YYYY-mm-dd in modo da predisporre il codice ad un futuro uso in ambito Web.

Dobbiamo inizialmente validare tale formato e in seguito verificare che la data non sia nel futuro, il che renderebbe di fatto il calcolo completamente errato.

Useremo le espressioni regolari e il modulo core datetime per implementare la fase di validazione.

import re
import sys
from datetime import datetime

def is_valid_birthday(date_str=''):
    valid = True
    reg = re.compile(r'^\d{4}-\d{2}-\d{2}$')
    if not reg.search(date_str):
        valid = False
        return valid
    format_dt = '%Y-%m-%d'
    try:
        dt = datetime.strptime(date_str, format_dt)
    except ValueError:
        valid = False
        return valid
    now = datetime.now()
    if dt > now:
        valid = False
    return valid

Abbiamo inserito volutamente una possibile ridondanza per mostrare come la validazione del formato può avvenire sia in modo superficiale (pattern matching) che profondo (il metodo datetime.strptime()). Dopo tale validazione possiamo confrontare la data di oggi con la data fornita: se tale data è superiore a quella odierna, la validazione fallisce.

A questo punto occorre calcolare la differenza tra le due date ottenendo un oggetto timedelta.

def get_dates_diff_delta(dt_str):
    dt = datetime.strptime(dt_str, '%Y-%m-%d')
    return datetime.now() - dt

Tale oggetto possiede la proprietà days che indica i giorni trascorsi ma non ha una proprietà per gli anni trascorsi. Sapendo che un anno è composto di 365 giorni, possiamo effettuare il seguente calcolo convertendo il risultato in un numero intero.

def get_years_from_delta(d):
    days_in_year = 365
    return int(d.days / days_in_year)

Il nostro codice verrà eseguito come segue:

def main():
    input_date = input('Insert your birth date (YYYY-mm-dd)')
    is_valid = is_valid_birthday(input_date)
    if not is_valid:
        print('Invalid date')
        sys.exit(1)
    years = get_years_from_delta(get_dates_diff_delta(input_date))
    print(f'You are {years} years old')
    sys.exit(0)


if __name__ == '__main__':
    main()
Torna su