API de fecha y hora de Java 8

Java 8 新特性Nuevas características de Java 8


Java 8 refuerza aún más el manejo de fechas y horas mediante la publicación de la nueva API Date-Time (JSR 310).

En versiones anteriores de Java, la API de fecha y hora tenía muchos problemas, entre ellos:

  • No segura para hilos (no thread-safe)- java.util.Date no es seguro para hilos; todas las clases de fecha son mutables, lo cual es uno de los mayores problemas de las clases de fecha de Java.

  • Diseño deficiente- Las clases de fecha/hora de Java no son consistentes en su definición: hay clases de fecha tanto en los paquetes java.util como java.sql, además las clases para formato y análisis se definen en el paquete java.text. java.util.Date incluye tanto fecha como hora, mientras que java.sql.Date solo incluye fecha, y no tiene sentido incluirlo en el paquete java.sql. Además, ambas clases tienen el mismo nombre, lo cual es en sí mismo un diseño muy malo.

  • Manejo problemático de zonas horarias- Las clases de fecha no ofrecen internacionalización ni soporte para zonas horarias. Por eso Java introdujo las clases java.util.Calendar y java.util.TimeZone, pero también presentan todos los problemas mencionados anteriormente.

Java 8, enjava.timeel paquete, proporciona muchas API nuevas. Las siguientes son dos de las API más importantes:

  • Local (local)- Simplifica el manejo de fecha y hora, sin problemas de zona horaria.

  • Zoned (zona horaria)- Maneja fecha y hora mediante la zona horaria especificada.

El nuevo paquete java.time cubre todas las operaciones para manejar fechas, horas, fecha/hora, zonas horarias, instantes, duraciones (during) y relojes (clock).


API de fecha y hora local

Las clases LocalDate/LocalTime y LocalDateTime se pueden usar cuando el manejo de la zona horaria no es necesario. El código es el siguiente:

Archivo Java8Tester.java

import java.time.LocalDate; import java.time.LocalTime; import java.time.LocalDateTime; import java.time.Month; public class Java8Tester { public static void main(String args[]){ Java8Tester java8tester = new Java8Tester(); java8tester.testLocalDateTime(); } public void testLocalDateTime(){ //Obtener la fecha y hora actuales LocalDateTime currentTime = LocalDateTime.now(); System.out.println("Hora actual:" + currentTime); LocalDate date1 = currentTime.toLocalDate(); System.out.println("date1: " + date1); Month month = currentTime.getMonth(); int day = currentTime.getDayOfMonth(); int seconds = currentTime.getSecond(); System.out.println("Mes:" + month +", día:" + day +", segundo:" + seconds); LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012); System.out.println("date2: " + date2); // 12 december 2014 LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12); System.out.println("date3: " + date3); //22 horas 15 minutos LocalTime date4 = LocalTime.of(22, 15); System.out.println("date4: " + date4); //Analizar cadenas LocalTime date5 = LocalTime.parse("20:15:30"); System.out.println("date5: " + date5); } }

Ejecute el script anterior, el resultado de salida es:

$ javac Java8Tester.java 
$ java Java8Tester
当前时间: 2016-04-15T16:55:48.668
date1: 2016-04-15
月: APRIL, 日: 15, 秒: 48
date2: 2012-04-10T16:55:48.668
date3: 2014-12-12
date4: 22:15
date5: 20:15:30

API de fecha y hora con zona horaria

Si necesitamos tener en cuenta la zona horaria, podemos usar la API de fecha y hora con zona horaria:

Archivo Java8Tester.java

import java.time.ZonedDateTime; import java.time.ZoneId; public class Java8Tester { public static void main(String args[]){ Java8Tester java8tester = new Java8Tester(); java8tester.testZonedDateTime(); } public void testZonedDateTime(){ //Obtener la fecha y hora actuales ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]"); System.out.println("date1: " + date1); ZoneId id = ZoneId.of("Europe/Paris"); System.out.println("ZoneId: " + id); ZoneId currentZone = ZoneId.systemDefault(); System.out.println("Zona horaria actual:" + currentZone); } }

Ejecute el script anterior, el resultado de salida es:

$ javac Java8Tester.java 
$ java Java8Tester
date1: 2015-12-03T10:15:30+08:00[Asia/Shanghai]
ZoneId: Europe/Paris
当期时区: Asia/Shanghai

Java 8 新特性Nuevas características de Java 8

Otras extensiones