API de fecha
Java 8 contiene API de fecha y hora completamente nuevas en el paquete java.time. La nueva API de fecha es comparable a la biblioteca
Joda-Time , sin embargo, no es la misma. Los siguientes ejemplos cubrirán las partes más importantes de la nueva API.
Reloj
Reloj da acceso a la fecha y hora actuales. Los relojes reconocen las zonas horarias y, por lo tanto, se pueden usar en lugar de
System.currentTimeMillis() para devolver la hora actual en milisegundos. Este tipo de precisión temporal también está representada por la clase
Instantánea .
Los instantes se pueden utilizar para crear objetos
java.util.Date heredados .
Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
Zonas horarias
Las zonas horarias están representadas por la clase abstracta
ZoneId . Se puede acceder fácilmente a ellos utilizando métodos estadísticos de fábrica. Las zonas horarias definen compensaciones que son importantes para convertir entre fecha y hora instantáneas y locales.
System.out.println(ZoneId.getAvailableZoneIds()); // prints all available timezone ids ZoneId zone1 = ZoneId.of("Europe/Berlin"); ZoneId zone2 = ZoneId.of("Brazil/East"); System.out.println(zone1.getRules()); System.out.println(zone2.getRules()); // ZoneRules[currentStandardOffset=+01:00] // ZoneRules[currentStandardOffset=-03:00]
Hora local
LocalTime muestra la hora sin zona horaria, por ejemplo 17:30:15. El siguiente ejemplo crea dos objetos de hora local para las zonas horarias definidas anteriormente. Luego comparamos los dos objetos y calculamos la diferencia en horas y minutos entre ellos.
LocalTime now1 = LocalTime.now(zone1); LocalTime now2 = LocalTime.now(zone2); System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); System.out.println(hoursBetween); // -3 System.out.println(minutesBetween); // -239
LocalTime viene con varios métodos de fábrica para facilitar la creación de instancias, incluido el análisis de cadenas.
LocalTime late = LocalTime.of(23, 59, 59); System.out.println(late); // 23:59:59 DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedTime(FormatStyle.SHORT) .withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse("13:37", germanFormatter); System.out.println(leetTime); // 13:37
Fecha local
LocalDate muestra una fecha específica, por ejemplo 2014-03-11. Las instancias son inmutables y funcionan de manera similar a LocalTime. El ejemplo demuestra cómo calcular una nueva fecha sumando o restando días, meses o años. Tenga en cuenta que cada operación sobre un objeto devuelve un nuevo objeto.
LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); System.out.println(dayOfWeek); // FRIDAY
Analizar LocalDate a partir de una cadena es tan simple como analizar LocalTime:
DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter); System.out.println(xmas); // 2014-12-24
Fecha y hora local
LocalDateTime muestra la fecha y hora. Esta es una combinación de la fecha y hora indicadas anteriormente, en una sola copia. Las instancias de LocalDateTime son inmutables y funcionan de manera similar a LocalTime y LocalDate. Podemos usar métodos para recuperar los valores de propiedad de la instancia que necesitamos:
LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439
junto con información adicional de zona horaria, la instancia se puede convertir a instantánea. Los instantáneos se pueden convertir fácilmente a los tipos antiguos que heredan de java.util.Date.
Instant instant = sylvester .atZone(ZoneId.systemDefault()) .toInstant(); Date legacyDate = Date.from(instant); System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014
Formatear una fecha y hora funciona de la misma manera que formatear una fecha u hora. En lugar de utilizar formatos de fecha predefinidos, podemos utilizar formatos definidos manualmente.
DateTimeFormatter formatter = DateTimeFormatter .ofPattern("MMM dd, yyyy - HH:mm"); LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); String string = formatter.format(parsed); System.out.println(string); // Nov 03, 2014 - 07:13
A diferencia de java.text.NumberFormat, el nuevo DateTimeFormatter es inmutable y seguro para subprocesos. Para obtener más información sobre la sintaxis para formatos de escritura, lea
aquí .
Anotaciones
Las anotaciones en Java 8 son repetibles. Veamos un ejemplo para ilustrar cómo funciona esto. Para comenzar, definiremos un contenedor de anotaciones que almacene una matriz de anotaciones válidas:
@interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); }
Java 8 nos permite usar múltiples anotaciones del mismo tipo declarando la anotación @Repeatable. Opción 1: usar la anotación del contenedor (vieja escuela) (Java 8 nos permite usar múltiples anotaciones del mismo tipo declarando una anotación
@Repeatable ). Opción 1: usar el contenedor de anotaciones (vieja escuela)
@Hints({@Hint("hint1"), @Hint("hint2")}) class Person {}
Opción 2: usar anotaciones repetibles ( nueva característica)
@Hint("hint1") @Hint("hint2") class Person {}
Usando la opción dos, el compilador de Java establece implícitamente la anotación @Hint. Esto es importante para leer la información de las anotaciones mediante la reflexión.
Hint hint = Person.class.getAnnotation(Hint.class); System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); System.out.println(hints2.length); // 2
Aunque no hemos declarado la anotación
@Hints para la clase
Persona , se puede leer usando el método
getAnnotation(Hints.class) . Sin embargo, un método más conveniente es
getAnnotationsByType , que proporciona acceso a todas las anotaciones mediante la anotación
@Hint . Además, el uso de anotaciones en Java 8 se amplía a dos propósitos:
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}
Esto es todo
Mi tutorial de programación Java 8 está completo. Si desea obtener más información sobre todas las nuevas clases y funciones API en JDK 8, simplemente lea mi próximo artículo. Esto le ayudará a comprender todas las clases nuevas y funciones ocultas de JDK 8, como
Arrays.parallelSort ,
StampedLock y
CompletableFuture .
GO TO FULL VERSION