Trabajo avanzado con fechas y horas en Java: de lo básico al profesionalismo
\n\nTrabajar con fechas y horas es una de las tareas clave de cualquier aplicación empresarial. En Java, durante mucho tiempo el estándar fue el engorroso java.util.Date y java.util.Calendar, pero con el lanzamiento de Java 8 la situación cambió drásticamente. La nueva API java.time (JSR-310) ofreció a los desarrolladores un conjunto de herramientas potente, seguro para subprocesos e intuitivo. En este artículo, analizaremos técnicas avanzadas para trabajar con fechas y horas que serán útiles para todo desarrollador Java.
1. Fundamentos de la API java.time: LocalDate, LocalTime, LocalDateTime
\n\nEl primer paso hacia el trabajo profesional es comprender las tres clases básicas que reemplazaron a las antiguas equivalentes:
\n\n- \n
- LocalDate — fecha sin hora (año, mes, día). \n
- LocalTime — hora sin fecha (horas, minutos, segundos, nanosegundos). \n
- LocalDateTime — combinación de fecha y hora sin vinculación a una zona horaria. \n
// Obtener la fecha y hora actuales\nLocalDate today = LocalDate.now(); // 2025-03-21\nLocalTime now = LocalTime.now(); // 14:30:15.123\nLocalDateTime current = LocalDateTime.now(); // 2025-03-21T14:30:15.123\n\n// Crear una fecha específica\nLocalDate birthDate = LocalDate.of(1990, Month.JUNE, 15);\nLocalTime meetingTime = LocalTime.of(10, 30, 0);\n\n// Manipulaciones con fechas\nLocalDate nextWeek = today.plusWeeks(1);\nLocalDate lastMonth = today.minusMonths(1);\n\nEstas clases son inmutables — cualquier operación devuelve un nuevo objeto. Esto garantiza la seguridad para subprocesos y la previsibilidad del código.
\n\n2. Trabajo con zonas horarias: ZonedDateTime y ZoneId
\n\nLas aplicaciones globales no pueden ignorar las zonas horarias. Para esto, java.time proporciona la clase ZonedDateTime.
// Hora actual en UTC\nZonedDateTime utcNow = ZonedDateTime.now(ZoneOffset.UTC);\n\n// Hora en una zona horaria específica\nZoneId moscowZone = ZoneId.of("Europe/Moscow");\nZonedDateTime moscowTime = ZonedDateTime.now(moscowZone);\n\n// Conversión entre zonas\nZonedDateTime nyTime = moscowTime.withZoneSameInstant(ZoneId.of("America/New_York"));\n\n// Obtener el desplazamiento\nZoneOffset offset = moscowTime.getOffset(); // +03:00\n\nConsejo profesional: siempre almacene las fechas en UTC en el servidor y conviértalas a la zona horaria local solo en la capa de presentación (UI). Esto evitará problemas con el cambio de horario de verano/invierno.
\n\n3. Análisis y formato de fechas: DateTimeFormatter
\n\nUna de las tareas más comunes es convertir una cadena en una fecha y viceversa. DateTimeFormatter ofrece capacidades flexibles.
Formato básico
\n\nDateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");\nLocalDateTime dateTime = LocalDateTime.parse("21.03.2025 14:30:00", formatter);\nString formatted = dateTime.format(formatter); // "21.03.2025 14:30:00"\n\nPatrones avanzados
\n\n// ISO-8601\nDateTimeFormatter isoFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;\nString isoDate = dateTime.format(isoFormatter); // "2025-03-21T14:30:00"\n\n// Formato localizado\nDateTimeFormatter italianFormatter = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ITALY);\nString italianDate = dateTime.format(italianFormatter); // "21 marzo 2025"\n\n// Formato personalizado con campos de texto\nDateTimeFormatter customFormatter = new DateTimeFormatterBuilder()\n .appendValue(ChronoField.YEAR)\n .appendLiteral(" año, ")\n .appendText(ChronoField.MONTH_OF_YEAR, TextStyle.FULL)\n .appendLiteral(" ")\n .appendValue(ChronoField.DAY_OF_MONTH)\n .toFormatter();\nString custom = dateTime.format(customFormatter); // "2025 año, marzo 21"\n\nEs importante recordar: DateTimeFormatter también es
Blogs
Book Recommendations
Leer también
Pruebas basadas en propiedades en TypeScript: cómo detectar errores que no buscabas
OAuth 2.0 y autorización JWT en JavaScript: guía completa
Generadores en Python: yield y optimización
YouTube API: cómo obtener la vista previa de un video y no pisar el rastrillo
Rust vs Python para backend: ¿qué elegir en 2025?