Trabajar con fechas sin hacer cuentas a mano

Ciencia y tecnologíaTrabajar con fechas sin hacer cuentas a mano

Una fecha no es simplemente una cadena con barras. Representa un día que debe existir en el calendario. Hoy trabajarás con date y timedelta para validar entradas y calcular plazos sin inventar reglas sobre la duración de los meses. Esta práctica amplía tus herramientas de Python pero no añade fechas obligatorias al inventario final.

Elegir la representación adecuada

Si solo necesitas saber en qué día revisar un material utiliza date. Si necesitas un instante con hora tendrás que estudiar datetime y las zonas horarias. Mezclar ambos problemas desde el principio añade dificultades innecesarias. Una revisión prevista para el 9 de octubre es una fecha; el registro exacto de una operación realizada a las seis de la mañana es otra clase de dato.

Para intercambiar fechas emplearemos el formato año-mes-día con ceros iniciales. La cadena 2026-10-09 evita la ambigüedad de escrituras como 09/10/2026 cuando el archivo viaja entre países. Puedes mostrar una presentación diferente a la persona pero conviene conservar un formato de intercambio definido y documentado.

inicio = date.fromisoformat("2026-10-09") revision = inicio + timedelta(days=14) print(revision.isoformat()) print((revision – inicio).days) «`

Las salidas serán 2026-10-23 y 14. Los objetos de fecha permiten sumar una duración y restar dos fechas. No tienes que comprobar manualmente cuántos días tiene octubre para realizar esta operación. Si el plazo cruza a otro mes o a otro año la biblioteca gestiona el calendario.

Validar que el día exista

Construir date(2026, 2, 30) produce ValueError porque febrero no tiene treinta días. Esta comprobación es más sólida que verificar únicamente que el día está entre uno y treinta y uno. Un validador escrito a mano necesitaría considerar el mes y los años bisiestos. Reutiliza la representación adecuada en lugar de duplicar sus reglas.

date.fromisoformat admite determinadas formas ISO que pueden variar según la versión. Si tu aplicación exige exactamente diez caracteres con el patrón año-mes-día debes comprobar también ese formato. Una estrategia sencilla consiste en convertir y exigir que isoformat devuelva exactamente el texto recibido después de quitar espacios exteriores. Así no aceptas variantes que tu contrato no contempla.

def leer_fecha(texto):
    limpio = texto.strip()
    fecha = date.fromisoformat(limpio)
    if fecha.isoformat() != limpio:
        raise ValueError("Usa el formato AAAA-MM-DD")
    return fecha

Esta función permite separar un error de calendario de una decisión sobre la escritura aceptada. Puedes adaptar el mensaje exterior para explicar ambos casos sin mostrar detalles innecesarios. Como en capítulos anteriores, la función devuelve un valor utilizable y deja la presentación a quien la llama.

Definir qué significa un plazo

Sumar catorce días naturales no equivale a sumar catorce días laborables. Tampoco equivale a añadir medio mes. Antes de programar una fecha límite aclara la regla. En esta práctica solo manejaremos días naturales. No estamos calculando vencimientos legales, festivos locales ni calendarios laborales.

También debes decidir si el día inicial cuenta. Al sumar catorce días a una fecha obtienes otra separada por catorce cambios de día. Si una actividad llama «día uno» a la fecha inicial su forma de contar puede ser distinta. La biblioteca realiza operaciones exactas pero no puede adivinar la convención de tu aplicación. Escríbela junto al requisito.

No sustituir meses por treinta días

Un mes no es una duración fija en días. Si quieres «el mismo día del mes siguiente» necesitas resolver qué ocurre cuando ese día no existe. Por ejemplo, después de un día treinta y uno puede venir un mes más corto. No utilices timedelta(days=30) afirmando que representa siempre un mes. Son operaciones diferentes y deben explicarse como tales.

Conseguir pruebas que no cambien mañana

Una función que utiliza date.today internamente puede producir un resultado distinto cada día. Para probarla es más sencillo recibir la fecha de referencia como parámetro. La interfaz podrá pasar la fecha actual cuando corresponda pero la prueba utilizará una fecha fija. Así podrás reproducir un error dentro de varias semanas.

Imagina una función dias_hasta_revision que recibe dos fechas y devuelve su diferencia en días. Una prueba con el 9 y el 23 de octubre siempre esperará catorce. Si la revisión ya pasó el resultado será negativo. No lo conviertas automáticamente en cero si necesitas distinguir una actividad vencida de otra prevista para hoy.

Errores habituales

Comparar fechas guardadas en formatos inconsistentes como cadenas puede dar resultados absurdos. «9/10/2026» no tiene una ordenación textual útil frente a «12/9/2026». Convierte primero a date. Aunque el formato ISO completo permite ordenar cadenas coherentes, trabajar con objetos expresa mejor la intención y valida los valores.

Otro error es mezclar instantes con y sin zona horaria al avanzar hacia datetime. Este capítulo no necesita esa complejidad pero sí debes reconocer el límite. Si una aplicación coordina personas de varios países o registra acontecimientos exactos tendrás que definir la zona y el significado del dato. Para una revisión por días mantén una fecha simple.

Cuando muestres una fecha conserva una salida estable. Un texto como «dentro de dos semanas» puede ayudar pero no sustituye al día concreto si después debes contrastar registros. En el cuaderno anota la entrada y el resultado ISO. Dejarás una referencia precisa que podrás convertir a otro formato de presentación más adelante.

Lo que deberías recordar

  • Una fecha debe existir en el calendario.
  • Define el formato de intercambio.
  • Días naturales y meses son conceptos distintos.
  • Las pruebas deben recibir fechas explícitas.

Ejercicio práctico

Ejecuta el ejemplo y comprueba las dos salidas. Después calcula catorce días a partir del 25 de diciembre de 2026. Anota antes la fecha que esperas y verifica que el cambio de año se resuelve sin condiciones escritas por ti.

Prueba leer_fecha con 2026-02-28, 2026-02-30 y una fecha con espacios exteriores. Añade una escritura que no cumpla el formato canónico. Registra cuáles se aceptan y qué regla incumple cada rechazo. No te limites a copiar el nombre de la excepción.

Escribe una función que reciba fecha_actual y fecha_revision y devuelva los días de diferencia. Compruébala con una revisión futura, otra del mismo día y otra pasada. Explica por qué recibir la referencia como argumento permite repetir la prueba en cualquier momento sin que el resultado dependa del calendario real.

Siguiente: Calcular cantidades decimales con precisión.

Volver al índice de Programar con Python.

Últimos posts

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí

 

Artículos más vistos

Horóscopo diario
Menú diario