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:
- Tomar prestado un mes: si
dayses negativo (es decir, el día del mes actual aún no llega al día del mes del cumpleaños), se resta uno amonths, porque el mes actual todavía no debe contar como un mes completo. - Tomar prestado un año: si
monthsahora es negativo (es decir, el mes actual aún no llega al mes de nacimiento), se suman 12 amonthsy se resta uno ayears, 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
datetimede la biblioteca estándar - Interpretar cadenas de fecha con
strptime()y darles formato constrftime() - Restar objetos
datetimepara 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,continueybreak
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.
