Este post es un resumen rápido de lo que nos podemos encontrar en la nueva API de manipulación de fechas y tiempo de Java 8.
Esta API es mucho más avanzada y potente que sus antecesores y tiene como objetivo facilitar la manipulación de fechas y horas y resolver los múltiples problemas y malentendidos que causaba la tradicional API de Java (Calendar, Date, etc.) especialmente con las horas en diferentes zonas horarias, etc.
Dentro de la nueva API, que se encuentra principalmente en el paquete java.time, podemos encontrar las siguientes clases:
1. Clock
Representa el tiempo del sistema. Tiene información sobre la zona horaria en la que nos encontramos. Puede ser usado para acceder al tiempo en milisegundos (desde el 1 de enero de 1970) o para obtener diferentes instantes de tiempo para crear diferentes representaciones del mismo en diferentes zonas horarios o cronologías.
1 2 |
// Representación del reloj del sistema en la zona horaria local Clock myClock = Clock.systemDefaultZone(); |
2. Instant
Representa un instante en la línea temporal del reloj (Clock). Esta siempre en UTC. Puede ser usado como una representación universal de tiempo o para obtener otras representaciones del mismo (pero requeriría de zona horaria). También puede usarase para obtener instancias de Date por motivos de compatibilidad con códigos antiguos (con la zona horaria local).
1 2 |
Instant now = myClock.instant(); Date legacyDate = Date.from(now); |
3. ZonedDateTime
Es una representacion de la fecha y el tiempo con información de la zona horaria completa.
1 2 |
Instant now = myClock.instant(); ZonedDateTime zdt = ZonedDateTime.ofInstant(now, ZoneId.of("Europe/Madrid")); |
4. OffsetDate, OffsetTime, OffsetDateTime
Representaciones de fecha, hora y fecha y hora respectivamente con información del desplezamiento de horas dentro de la zona horaria correspondiente (pero sin información sobre el nombre de la zona, por ejemplo).
1 |
OffsetDateTime nowWithTz = OffsetDateTime.now(); |
5. LocalDate, LocalTime, LocalDateTime
Representación de fecha, hora y fecha y hora respectivamente sin información sobre la zona horaria. Es la forma preferida de representación y la recomendada si no se requieren datos sobre las zonas horarias.
1 2 3 |
LocalDateTime ldt = LocalDateTime.now(); LocalDate ld = LocalDate.of(2015, 10, 14); // 10 de Octubre de 2015 LocalTime lt = LocalTime.of(12:00); // 12:00 |
6. ZoneId
Representación de las zonas horarias.
1 2 |
ZoneId localTimeZone = ZoneId.systemDefault(); ZoneId berlinZone = ZoneId.of("Europe/Berlin"); |
7. DateTimeFormatter
Formateador de fechas y horas para parsear, transformar u obtener las mismas en diferentes formatos.
1 2 3 4 5 6 7 |
LocalDate ld = LocalDate.now(); // Fecha en formato ISO String fecha = ld.format(DateTimeFormatter.ISO_LOCAL_DATE); DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT); // Fecha en formato SHORT String otra_fecha = dateFormatter.format(ld); |
8. Period
Representa un intervalo de tiempo concreto (mínimo un día). Se pueden usar en las operaciones con fechas (plusXXX(), minusXXX()).
1 2 |
Period p = Period.ofMonths(1); // Un mes Period p = Period.of (1,0,7); // Un año y 7 días |
9. Duration
Igual que los Period pero en este caso también admiten horas, minutos, segundos, etc.
1 |
Duration gap = Duration.ofSeconds(10); |
Se puede encontrar más información sobre la API de tiempo de Java 8 en los siguientes enlaces:
http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html
https://docs.oracle.com/javase/tutorial/datetime/iso/overview.html
https://docs.oracle.com/javase/tutorial/datetime/index.html