Java Fecha y Hora
โก Resumen inteligente
Java El manejo de fechas y horas combina las clases heredadas java.util.Date y SimpleDateFormat con la API moderna java.time introducida en Java 8, que proporciona a los desarrolladores tipos inmutables y seguros para subprocesos para un trabajo preciso con el calendario.

Manejo de fechas y horas en Java Es una parte rutinaria de la creaciรณn de lรณgica de programaciรณn, marcas de tiempo de registro, informes y registros de auditorรญa. Antes de escribir cualquier cรณdigo, es รบtil conocer los parรกmetros que componen una fecha:
- El year (en dos o cuatro dรญgitos).
- El mes (como dos dรญgitos, como las tres primeras letras del mes o como el nombre completo del mes).
- El datos (el nรบmero real del dรญa del mes).
- El day (el nombre del dรญa en la fecha indicada, como dom., lun., mar.).
Java Expone muchos otros parรกmetros que describen un momento en la lรญnea de tiempo, como la era, la semana del aรฑo, la zona horaria y el desfase horario. Las secciones siguientes cubren cada uno de ellos con ejemplos prรกcticos.
Mostrar fecha en Java
Java proporciona una Date clase en el java.util Paquete. La clase almacena un instante especรญfico en el tiempo con precisiรณn de milisegundos y ofrece mรฉtodos auxiliares para imprimir, comparar y formatear ese instante. Para obtener la fecha y hora actuales, instancie la clase con su constructor predeterminado:
import java.util.Date; class Date_Ex1 { public static void main(String args[]) { // Instantiate a Date object by invoking its constructor Date objDate = new Date(); // Display the Date and Time using toString() System.out.println(objDate.toString()); } }
Salida:
Wed Nov 29 06:36:22 UTC 2017
El ejemplo imprime la fecha en el formato toString predeterminado. Para mostrar el mismo instante en un patrรณn diferente, primero debe comprender las letras de formato que Java usos.
SimpleDateFormat: analizar y formatear fechas
El SimpleDateFormat clase en java.text convierte un Date objeto en una cadena formateada y analiza una cadena formateada de nuevo en una DateUtiliza letras con patrones que se corresponden con un componente de fecha u hora. La siguiente tabla enumera todas las letras compatibles:
| Carta | Componente de fecha u hora | Ejemplo |
|---|---|---|
| G | Designador de era | AD |
| y | Aรฑo | 2026 |
| M | Mes del aรฑo | julio o julio o 07 |
| w | Semana en el aรฑo | 27 |
| W | Semana en mes | 2 |
| D | Dรญa en el aรฑo | 189 |
| d | Dรญa en mes | 10 |
| F | Dรญa de la semana en el mes | 2 |
| E | Nombre del dรญa en la semana | martes o martes |
| u | Nรบmero de dรญa de la semana (1 = Monday, 7 = Domingo) | 1 |
| a | Marcador AM o PM | PM |
| H | Hora del dรญa (0-23) | 0 |
| k | Hora del dรญa (1-24) | 24 |
| K | Hora en AM o PM (0-11) | 0 |
| h | Hora en AM o PM (1-12) | 12 |
| m | Minuto en hora | 30 |
| s | Segundo en minuto | 55 |
| S | Milisegundo | 978 |
| z | Zona horaria (nombre) | Hora estรกndar del Pacรญfico; PST; GMT -08: 00 |
| Z | Zona horaria (desplazamiento RFC 822) | -0800 |
| X | Zona horaria (desplazamiento segรบn la norma ISO 8601) | -08 o -0800 o -08:00 |
No es necesario que recuerdes toda la tabla. Consรบltala siempre que crees un nuevo patrรณn.
Cรณmo usar SimpleDateFormat
SimpleDateFormat es una subclase de DateFormat Esto te permite formatear y analizar fechas usando las letras del patrรณn anterior. Combina las letras para describir la cadena exacta que deseas generar o leer.
Por ejemplo:
- Formato de fecha requerido: 2012.10.23 20:20:45 PST. El patrรณn de formato apropiado es
yyyy.MM.dd HH:mm:ss zzz. - Formato de fecha requerido: 09:30:00 AM 23-May-2012. El patrรณn de formato apropiado es
hh:mm:ss a dd-MMM-yyyy.
Tip: Mayรบsculas M es mes, minรบscula m es minรบsculo. Mayรบscula H es un reloj de 24 horas, minรบsculas h Es un reloj de 12 horas. Mezclarlos produce un resultado errรณneo silencioso.
El siguiente programa imprime la fecha actual dos veces, una en formato predeterminado y otra mediante un patrรณn SimpleDateFormat:
import java.text.SimpleDateFormat; import java.util.Date; class TestDates_Format { public static void main(String args[]) { // Current system date and time is assigned to objDate Date objDate = new Date(); System.out.println(objDate); // Build the target pattern and format the date String strDateFormat = "hh:mm:ss a dd-MMM-yyyy"; SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat); System.out.println(objSDF.format(objDate)); } }
Salida:
Wed Nov 29 06:31:41 UTC 2017 06:31:41 AM 29-Nov-2017
Ejemplo de comparaciรณn de fechas
La forma mรกs fiable de pedir dos Date los objetos son el compareTo() Mรฉtodo. Devuelve un entero negativo cuando la llamada se realiza antes, cero cuando ambos instantes coinciden y un entero positivo cuando la llamada se realiza despuรฉs. El siguiente fragmento analiza dos cadenas de fecha e imprime su orden relativo:
import java.text.SimpleDateFormat; import java.text.ParseException; import java.util.Date; class TestDates_Compare { public static void main(String args[]) throws ParseException { SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy"); Date dt_1 = objSDF.parse("20-08-1981"); Date dt_2 = objSDF.parse("12-10-2012"); System.out.println("Date1 : " + objSDF.format(dt_1)); System.out.println("Date2 : " + objSDF.format(dt_2)); // compareTo returns > 0 when dt_1 is after dt_2 if (dt_1.compareTo(dt_2) > 0) { System.out.println("Date 1 occurs after Date 2"); } // compareTo returns < 0 when dt_1 is before dt_2 else if (dt_1.compareTo(dt_2) < 0) { System.out.println("Date 1 occurs before Date 2"); } // compareTo returns 0 when both dates are equal else { System.out.println("Both are the same date"); } } }
Salida:
Date1 : 20-08-1981 Date2 : 12-10-2012 Date 1 occurs before Date 2
Nota: El cรณdigo original utilizaba el patrรณn dd-mm-yyyy. La minรบscula mm La letra es minuto, no mes, por lo que el analizador produjo silenciosamente un valor de mes incorrecto. La soluciรณn anterior utiliza mayรบsculas. MM para el mes, que es la letra del patrรณn correcto.
Java 8 API moderna de fecha y hora (java.time)
Java 8 introdujo el java.time Paquete con una API rediseรฑada inspirada en la biblioteca Joda-Time. Las nuevas clases son inmutables, seguras para subprocesos y separan el calendario humano de la lรญnea de tiempo de la mรกquina. Los tipos mรกs comunes son:
LocalDatepara una fecha sin hora ni zona horaria (por ejemplo, un cumpleaรฑos).LocalTimepara una hora en el reloj de pared sin fecha ni zona horaria.LocalDateTimepara una fecha y hora sin zona horaria.ZonedDateTimepara una fecha y hora con una zona horaria especรญfica.OffsetDateTimepara una fecha y hora con un desplazamiento UTC pero sin zona horaria con nombre.Instantpara una marca de tiempo de mรกquina medida desde la รฉpoca UNIX.DurationyPeriodpara importes basados โโen el tiempo y en la fecha.
El siguiente ejemplo imprime la fecha, la hora, la marca de tiempo y la zona horaria actuales utilizando la API moderna:
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.time.Instant; import java.time.ZoneId; class ModernDateDemo { public static void main(String args[]) { LocalDate today = LocalDate.now(); LocalDateTime now = LocalDateTime.now(); ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata")); Instant epoch = Instant.now(); System.out.println("LocalDate : " + today); System.out.println("LocalDateTime : " + now); System.out.println("ZonedDateTime : " + zoned); System.out.println("Instant : " + epoch); } }
Cada tipo tiene mรฉtodos de fรกbrica (now, of, parse) y operaciones inmutables (plusDays, minusHours, withYear) que devuelven un valor nuevo en lugar de modificar el objeto original.
DateTimeFormatter: Formatear fechas en formato moderno Java
DateTimeFormatter in java.time.format reemplaza SimpleDateFormatUtiliza el mismo estilo de letras de patrรณn, es inmutable y se puede compartir de forma segura entre hilos sin sincronizaciรณn adicional. La clase tambiรฉn expone constantes predefinidas como ISO_LOCAL_DATE y ISO_ZONED_DATE_TIME para formatos estรกndar.
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; class FormatterDemo { public static void main(String args[]) { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME; DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy"); System.out.println(now.format(iso)); System.out.println(now.format(human)); LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso); System.out.println("Parsed back : " + parsed); } }
Para comparar dos fechas en la API moderna, llame a isBefore, isAfter, o isEqualEstos mรฉtodos se leen con mayor claridad que compareTo y trabajar con cada uno java.time clase.
Seguridad de los hilos y mejores prรกcticas para Java Fecha y Hora
Ambos java.util.Date y SimpleDateFormat son anteriores a los concurrentes modernos. Javay cada una tiene sus inconvenientes conocidos. Siga las prรกcticas que se indican a continuaciรณn para mantener un manejo correcto de las fechas en el cรณdigo de producciรณn:
- Prefiera java.time a Date y Calendar. Los nuevos tipos son inmutables y seguros para subprocesos, y modelan el dominio con mayor precisiรณn (fechas sin horas, horas sin zonas horarias, etc.).
- No compartas un SimpleDateFormat entre hilos. La clase almacena el estado de anรกlisis interno y no es segura para subprocesos. Envuรฉlvala en una
ThreadLocal, sincronizar en la instancia o cambiar aDateTimeFormatter. - Especifique siempre una configuraciรณn regional. Los nombres de los meses y los dรญas cambian con la configuraciรณn regional predeterminada de la JVM, lo que hace que patrones como
MMMyEEEno portรกtil. Pase una configuraciรณn regional explรญcitamente (por ejemplo,Locale.ENGLISH). - Sea explรญcito sobre las zonas horarias.
LocalDateTimeno tiene zona, asรญ que conviรฉrtalo aZonedDateTimeorInstantSiempre que el momento exacto importa, especialmente para los registros, las columnas de la base de datos y las cargas รบtiles de la red. - Realice la conversiรณn entre las dos API con cuidado. Usar
date.toInstant(),Date.from(instant), ycalendar.toInstant().atZone(zone)en la frontera entre el cรณdigo heredado y el cรณdigo moderno. - Almacenar marcas de tiempo en UTC. Persiste y transmit fechas como UTC (un
Instanto una cadena ISO 8601) y convertir a la zona de usuario solo cuando se muestre.


