El Día 006 del reto 100 Días de Python calcula cuánto tiempo ha vivido una persona a partir de una fecha ingresada en formato MM/DD/YYYY. Reporta el resultado en años, meses, días, horas, minutos y segundos, todo a la vez.

La verdadera lección de este proyecto no es datetime en sí, sino que los calendarios son más desordenados de lo que parecen. No puedes simplemente restar dos fechas y dividir entre 30 para obtener los meses, porque no todos los meses tienen el mismo número de días. Esta guía recorre el código fuente completo del Día 006 y explica exactamente cómo maneja correctamente ese desorden.

Descripción del Proyecto

El programa usa datetime.strptime() para interpretar la fecha de nacimiento del usuario y datetime.now() para obtener la fecha actual. Los años y los meses requieren una lógica de calendario adicional más allá de una simple resta: el programa compara el mes y el día actuales con el mes y el día de nacimiento, y “toma prestado” un año o un mes cuando la fecha actual aún no ha llegado al día del mes o al mes de la fecha de nacimiento.

Código Fuente

El proyecto del Día 006 está en day006/main.py, dentro del repositorio 100daysofpython:

from datetime import datetime

def birthdate():
    while True:
        birth_input = input("Enter your birthdate (MM/DD/YYYY) or 'q' to quit: ")

        if birth_input.lower() == 'q':
            print("Exiting program.")
            break

        try:
            birthdate = datetime.strptime(birth_input, "%m/%d/%Y")
        except ValueError:
            print("Error: Wrong format. Please use MM/DD/YYYY.")
            continue  # Ask again

        now = datetime.now()
        time_in_between = now - birthdate
        total_days = time_in_between.days
        total_seconds = int(time_in_between.total_seconds())
        total_hours = total_seconds // 3600
        total_minutes = total_seconds // 60

        # Calculate years and months manually
        years = now.year - birthdate.year
        months = now.month - birthdate.month
        days = now.day - birthdate.day

        if days < 0:
            months -= 1
        if months < 0:
            years -= 1
            months += 12

        total_months = years * 12 + months
        formatted_birthdate = birthdate.strftime("%B %d, %Y")

        print(f"\nIf you were born on {formatted_birthdate}, you have lived:")
        print(f"Total Years: {years:,}")
        print(f"Total Months: {total_months:,}")
        print(f"Total Days: {total_days:,}")
        print(f"Total Hours: {total_hours:,}")
        print(f"Total Minutes: {total_minutes:,}")
        print(f"Total Seconds: {total_seconds:,}\n")


if __name__ == "__main__":
    birthdate()

Cómo Funciona el Programa

Interpretar una Cadena de Fecha con strptime

birthdate = datetime.strptime(birth_input, "%m/%d/%Y")

strptime() (“string parse time”) convierte una cadena de texto en un objeto datetime real, según un código de formato. "%m/%d/%Y" le indica a Python que espere un mes de dos dígitos, un día de dos dígitos y un año de cuatro dígitos, separados por diagonales, lo que coincide con el formato MM/DD/YYYY que pide el mensaje. Si lo ingresado no coincide con ese patrón, strptime() lanza un ValueError, que el try/except circundante captura para que el programa pueda preguntar de nuevo en lugar de cerrarse con un error.

Obtener los Números Fáciles con una Resta

time_in_between = now - birthdate
total_days = time_in_between.days
total_seconds = int(time_in_between.total_seconds())
total_hours = total_seconds // 3600
total_minutes = total_seconds // 60

Restar un datetime de otro devuelve un objeto timedelta, que ya conoce el total de días y segundos transcurridos. Las horas y los minutos se derivan entonces de total_seconds mediante división entera (//), que descarta cualquier residuo.

Por Qué los Años y los Meses Necesitan Lógica Manual

years = now.year - birthdate.year
months = now.month - birthdate.month
days = now.day - birthdate.day

if days < 0:
    months -= 1
if months < 0:
    years -= 1
    months += 12

No puedes calcular la edad en años simplemente restando los números de los años, porque eso ignora si el cumpleaños ya ocurrió este año. Este código lo resuelve en dos pasos:

  1. Tomar prestado un mes: si days es negativo (es decir, el día del mes actual aún no llega al día del mes del cumpleaños), se resta uno a months, porque el mes actual todavía no debe contar como un mes completo.
  2. Tomar prestado un año: si months ahora es negativo (es decir, el mes actual aún no llega al mes de nacimiento), se suman 12 a months y se resta uno a years, la misma lógica de “pedir prestado” al restar a mano.

Este patrón de préstamo en dos pasos es la forma estándar de calcular diferencias de edad precisas según el calendario, sin una biblioteca de fechas especializada.

Dar Formato a la Fecha de Nacimiento para Mostrarla

formatted_birthdate = birthdate.strftime("%B %d, %Y")

strftime() (“string format time”) hace lo contrario de strptime(): convierte un objeto datetime de vuelta en una cadena legible. "%B %d, %Y" produce algo como "March 15, 1995", usando el nombre completo del mes en lugar del MM/DD/YYYY numérico que escribió el usuario.

Qué Enseña Este Proyecto

El Día 006 introduce:

  • El módulo datetime de la biblioteca estándar
  • Interpretar cadenas de fecha con strptime() y darles formato con strftime()
  • Restar objetos datetime para obtener el tiempo transcurrido
  • Lógica manual de “préstamo” para diferencias precisas de años y meses según el calendario
  • Usar juntos while True, continue y break

Ejecutar el Proyecto

git clone https://github.com/victorhugo81/100daysofpython.git
cd 100daysofpython/day006
python main.py

Posibles Siguientes Pasos

Cuando entiendas el código existente, intenta ampliarlo:

  • Muestra los días sobrantes después del último mes completo, no solo el total acumulado
  • Agrega una verificación que rechace una fecha de nacimiento en el futuro
  • Muestra una cuenta regresiva de “días para tu próximo cumpleaños”
  • Compara dos fechas cualesquiera en lugar de usar siempre hoy como fecha final

Conclusión

El Día 006 del reto 100 Días de Python demuestra que trabajar con fechas implica más que una resta básica: datetime maneja automáticamente los cálculos fáciles como el total de días y segundos, pero los años y meses precisos según el calendario requieren el tipo de lógica de préstamo manual que este proyecto recorre paso a paso. Es un patrón verdaderamente útil de entender, ya que aparece siempre que necesitas calcular la edad, la antigüedad o la duración en términos legibles para las personas.

Consulta el código fuente del Día 006 en GitHub y sigue explorando el índice de proyectos del repositorio mientras construyes más programas en Python, un día y un proyecto pequeño a la vez.