Errores comunes de Python datetime, y qué están haciendo (o no) las bibliotecas al respecto
Manejar fechas y horas en software resulta mucho más complejo que “solo usar UTC”, especialmente cuando entran en juego el horario de verano, las leyes cambiantes de zonas horarias y eventos futuros orientados a personas como reuniones o contratos. Los comentaristas debaten cómo debería Python `datetime` y las bibliotecas alternativas representar el tiempo: instantes UTC, horas locales de “reloj”, desfases fijos o zonas horarias IANA completas, y si las bibliotecas deberían permitir tiempos ambiguos o inexistentes. Muchos concluyen que no existe un único modelo que sirva para todos los casos, así que las bibliotecas robustas necesitan múltiples tipos explícitos y compensaciones claras en lugar de una sola abstracción mágica de marca temporal.
UTC frente a hora local y fechas futuras
- Muchos sostienen que “guardar todo en UTC” funciona bien para eventos pasados y marcas de tiempo centradas en la máquina.
- Otros subrayan que esto falla para horas futuras programadas por personas (reuniones, citas, contratos).
- Punto clave: las horas futuras en reloj local suelen almacenarse como (fecha y hora local + zona horaria IANA), no preconvertidas a UTC, porque las reglas de zona horaria/DST pueden cambiar.
- No existe una regla universal: a veces los usuarios quieren un instante fijo en UTC, y a veces una “hora local” en un lugar.
DST, zonas horarias y expectativas humanas
- El DST y la política de zonas horarias son políticos y cambiantes; no puedes predecir las reglas futuras.
- Los eventos recurrentes (“cada lunes a las 10:00”, “1:1 cada dos semanas a la 1 PM”) no deberían desplazarse una hora al cruzar el DST; eso requiere modelar la hora local y las zonas explícitamente.
- Las reuniones entre continentes sufren desajustes temporales cuando las transiciones de DST ocurren en fechas distintas; los calendarios suelen elegir una zona de referencia.
Formatos de datos y épocas (ISO 8601, tiempo Unix, etc.)
- ISO 8601 / RFC 3339 ayudan con el formato de cadenas, pero no resuelven la semántica de zona horaria/DST ni la ubicación.
- Los formatos MM/DD/YYYY al estilo estadounidense y herramientas como Excel se consideran grandes fuentes de errores.
- Los segundos desde la época Unix (o micro/nanosegundos enteros) son populares para la representación interna, pero el soporte pre-1970 y los segundos intercalares son complicados.
Segundos intercalares
- Algunas bibliotecas (por ejemplo, de propósito general, incluidas las discutidas) ignoran los segundos intercalares; otras especializadas (por ejemplo, centradas en astronomía) los manejan.
- Las opiniones difieren: algunos ven aceptable ignorar los segundos intercalares para la mayoría de las aplicaciones; otros señalan que esto rompe el cálculo preciso de duraciones/instantes y el análisis de “23:59:60”.
Diseño de bibliotecas: tipos y comportamiento
- Fuerte apoyo a tipos distintos:
- Instant/UTC-only,
- ZonedDateTime (zonas IANA),
- OffsetDateTime (desfase fijo),
- Local/naive date-times para casos de uso de reloj local o recurrentes tipo “alarma”.
- Combinar datos ingenuos y zonificados en un solo tipo (como en algunas bibliotecas de JS y Python) es ampliamente criticado.
- Debate sobre representar tiempos inexistentes durante los huecos de DST:
- Algunos prefieren prohibir o generar error en tiempos locales inválidos.
- Otros prefieren mapeos “best-effort” deterministas y documentados, aunque sorprendan.
Concepto de “hora local”
- Algunos argumentan que la “hora local” del sistema es un error histórico salvo para la UI y la compatibilidad con libc; mejor especificar siempre zonas horarias o ubicaciones explícitas.
- Otros señalan que los usuarios normales y los dispositivos aún necesitan una noción de hora local de reloj para alarmas, tareas tipo cron y la semántica de “4pm en el café”.