Original: http://it.deepinmind.com/java/2015/03/17/20-examples-date-ndate-di-from-java8.html
Además de las expresiones de Lambda, Stream y varias pequeñas mejoras, Java 8 también introdujo un nuevo conjunto de API de tiempo y fecha en este tutorial, aprenderemos cómo usar Java 8 a través de varios ejemplos de tareas simples. Las fechas, los calendarios y el procesamiento de tiempo de Java siempre han sido criticados, especialmente decide definir java.util.Date como modificado y utilizar SimpleFormat en la seguridad sin thrwead. Parece que Java se ha dado cuenta de que necesita proporcionar un mejor soporte para las funciones de tiempo y fecha, lo que también es algo bueno para la comunidad que está acostumbrada a usar la base de datos de Joda Time. La mayor ventaja de esta nueva biblioteca de tiempo y fecha es que define algunos conceptos relacionados con la hora y la fecha. y período. Al mismo tiempo, también toma prestado algunas ventajas de la Biblioteca Joda, como distinguir entre personas y máquinas para distinguir la fecha de tiempo. Java 8 todavía usa el sistema de calendario ISO y, a diferencia de sus predecesores, las clases en el paquete Java.Time son inutilizables y de hilo. La nueva API de hora y fecha se encuentra en el paquete Java.Time.
La nueva biblioteca también agrega ZoneOffset y Zoned para proporcionar un mejor soporte para la zona horaria. Con el nuevo DateTimeFormatter, el análisis y el formateo de la fecha después de la fecha se han vuelto nuevos. Solo mencione, estaba escribiendo este artículo cuando Java estaba a punto de lanzar esta nueva función en este momento, por lo que encontrará que el tiempo en el ejemplo es el año pasado. Si ejecuta estos ejemplos, los valores que devuelven deben ser correctos.
Alguien me preguntó cuál es la mejor manera de aprender una nueva biblioteca. Mi respuesta es usarlo en proyectos reales. Habrá una variedad de necesidades en un proyecto real, que promoverá a los desarrolladores para explorar y estudiar esta nueva biblioteca. En resumen, solo la tarea en sí misma realmente lo promoverá para explorar y aprender. La nueva API de fecha y hora de Java 8 es la misma. Para aprender esta nueva biblioteca de Java 8, creé 20 ejemplos orientados a la tarea aquí. Comencemos con una tarea simple. Diciendo que se dice que desarrolla una aplicación de recordatorios para encontrar una fecha específica, como cumpleaños, aniversario del domingo, la próxima fecha de la cuenta, cuántos días hay para la próxima fecha premium o la hora de vencimiento de la tarjeta de crédito.
Hay una clase llamada localdate en Java 8, que puede usarse para representar la fecha de hoy. Esta clase es ligeramente diferente de java.util.date, porque solo contiene la fecha y no tiene tiempo. Por lo tanto, si solo necesita indicar la fecha en lugar de la hora, puede usarla.
LocalDate Today = localDate.Now ();
Puede ver que se crea hoy pero no incluye información de tiempo. También forma el formato de fecha y lo genera.
La clase LocalDate proporciona algunas formas muy convenientes de usar la fecha y otros atributos de fecha que se pueden usar para extraer. Usando estos métodos, puede obtener cualquier atributo de fecha que necesite, y ya no necesita usar una clase como java.util.calendar:
Localdate hoy = localdate.now (); año, mes, día); Fecha local de hoy: 2014-01-14 Año: 2014 Mes: 1 día: 14
Se puede ver que es muy simple obtener la información anual en Java 8. Solo necesita usar el método de Getter correspondiente, sin memoria, muy intuitiva. Puede compararlo con la escritura de la actual mes y día en Java.
En el primer ejemplo, vemos que es muy simple generar la fecha del día a través del método estático, pero a través de otro método de fábrica muy útil local. el año, el mes y luego devolver una instancia de Date de localidad equivalente. Otra buena noticia sobre este método es que no cometió ningún error en la API antes. Lo que escribe aquí es lo que escribe aquí, por ejemplo, en el siguiente ejemplo, representa el 14 de enero, no hay lógica oculta.
Localdate dateOfBirth = localdate.of (2010, 01, 14);
Se puede ver que la fecha de creación es lo que escribimos, 14 de enero de 2014.
Hablando de las tareas de tiempo y fecha de procesamiento reales en realidad, una es común para verificar si dos fechas son iguales. A menudo puede encontrar si juzgar si hoy es un día especial, como cumpleaños, aniversario o vacaciones. A veces, le dará una fecha para que pueda verificar si es un día determinado. El siguiente ejemplo lo ayudará a completar tales tareas en Java 8. Como piensa, localDate reescribió el método igual para comparar la fecha, como se muestra a continuación:
Localdate date1 = localdate.of (2014, 01, 14); 2014-01-14 y fecha1 2014-01-14 son la misma fecha
En este ejemplo, nuestra comparación dos fechas son iguales. Al mismo tiempo, si obtiene una cadena de fecha formateada en el código, debe resolverla como una fecha antes de poder compararla. Puede comparar este ejemplo para comparar la comparación previa de Java, y encontrará que es mucho mejor.
También hay una tarea práctica relacionada con la fecha de tiempo en Java para verificar los eventos duplicados. Si trabaja en una compañía de comercio electrónico, entonces habrá un módulo que enviará deseos de cumpleaños a los usuarios y les dará saludos en cada fiesta importante, como Navidad, Acción de Gracias, en India, puede ser posible en la India. es Deepawali. ¿Cómo determinar si es un festival o un incidente repetido en Java? Use la clase de mes de mes. Esta categoría se combina por mes y no incluye información anual, lo que significa que puede usarla para representar algunos de los días que aparecen se repiten cada año. Por supuesto, hay algunas otras combinaciones, como la clase de Yearmonth. Tampoco puede cambiar y enhebrar de forma segura como otros tipos en la biblioteca New Time, y también es una clase de valor. Veamos cómo usar el día mes para verificar una fecha duplicada:
Cumpleaños de DteAlday de DteAlday (2010, 01, 14); Println ("¡Muchos muchos retornos felices del día!");Aunque el año es diferente, hoy es el día del cumpleaños, por lo que verá una bendición de cumpleaños en la producción. Puede ajustar la hora del sistema y ejecutar el programa para ver si puede recordarle cuándo es el próximo cumpleaños.
Esto es muy similar a la fecha actual en el primer ejemplo. Esta vez usamos una clase llamada Localtime. Aquí también puede usar un método de fábrica estática ahora () para obtener la hora actual. El formato predeterminado es HH: MM: SS: NNN, y el NNN aquí es nanosegundos. Se puede comparar con cómo obtener el tiempo actual con Java 8.
Localtime Time = localtime.now ();
Se puede ver que la hora actual no incluye la fecha, porque Localtime solo tiene tiempo y ninguna fecha.
Muchas veces necesitamos aumentar el tiempo futuro en cada minuto o segundo. Java 8 no solo proporciona clases sin cambios y de hilo, sino que también proporciona algunos métodos más convenientes, como plusus () para reemplazar el método ADD () original. Por cierto, estos métodos devuelven una referencia a una nueva instancia de Localtime, porque Localtime es inmutable, no olvide almacenar esta nueva referencia.
Localtime Time = LocalTime.NOW (); : 33.369
Puede ver que después de 2 horas de la hora actual, es 16: 33: 33.369. Ahora puede compararlo con una antigua forma de agregar o reducir la antigua forma en Java. A primera vista, sabes de qué manera es mejor.
Esto es similar al ejemplo anterior de las dos horas anteriores. LocalDate se usa para indicar la fecha sin tiempo. Debido a que el Date Local también es inmutable, cualquier operación de modificación devolverá un nuevo ejemplo, así que no olvide guardarlo.
Localdate nextweek = hoy.plus (1, cronounit.weeks); IS: 2014-01-14 Fecha después de 1 semana: 2014-01-21
Puedes ver cuál es la fecha después de 7 días. Puede usar este método para aumentar un mes, un año, una hora, un minuto o incluso diez años, consulte la clase de Chronounit en la API Java para obtener más opciones.
Esta es la secuela del ejemplo anterior. En el ejemplo anterior, aprendimos a usar el método Plus () de Detate local para aumentar la fecha de la fecha, la semana o el mes.
LocalDate Anterior Year = Today.Minus (1, Chronousit.Years); " + Nextyear); Salida: Fecha antes de 1 año: 2013-01-14 Fecha después de 1 año: 2015-01-14
Se puede ver que hay dos años en total, uno es 2013, y el otro es 2015, que es el año anterior y posterior a 2014.
Java 8 viene con una clase de reloj, puede usarlo para obtener la hora, fecha o hora instantánea actuales en una cierta zona horaria. Puede usar Clock para reemplazar el método System.CurrentTimeInmillis () y TimeZone.getDefault ().
// Devuelve la hora actual según el reloj de su sistema y establezca en UTC. .Systemdefaultzone ();
Puede usar la fecha especificada para comparar con este reloj, por ejemplo, de la siguiente manera:
Clase pública myClass {Reloj de reloj privado;Si necesita lidiar con las fechas de diferentes zonas horarias, esto es bastante conveniente.
Esta también es una tarea común en proyectos reales. ¿Cómo se juzga si una cierta fecha está frente o detrás de otra fecha, o simplemente igual? En el Java 8, la clase localDate tiene métodos isbore () e isafter () que pueden usarse para comparar dos fechas. Si la fecha del método de llamada es anterior a la fecha dada, el método isbore () devolverá verdadero.
Localdate tomomorrow = localdate.of (2014, 1, 15); ; Ayer.
Se puede ver que la fecha en Java 8 es relativamente simple. No es necesario usar otra clase como Calendar para completar tareas similares.
Java 8 no solo separa la fecha y la hora, sino también a veces regiones. Ya hay varios grupos relacionados con las zonas horarias. Es equivalente a la clase Gregoriancalendar antes del Java 8. Usando esta clase, puede convertir la hora local en el tiempo correspondiente en otra zona horaria, como el siguiente ejemplo:
// Fecha y hora con la zona horaria en Java 8 ZoneId America = ZONEID.OF ("American/News"); TimeZone: " + DatEnandTimeinNewyork); Salida: Fecha y hora actuales en una zona horaria particular: 2014-01-14T16: 33.373-05: 00 [American/New_york]Se puede comparar con el tiempo para convertir la hora local en tiempo GMT. Por cierto, como antes del Java 8, el texto en la zona horaria correspondiente no debe equivocarse, de lo contrario encontrará tal excepción:
Excepción en el hilo "Main" java.time.zone.zonerseeException: ID de zona de tiempo desconocida: Asia/Tokio en lesprovider.java:272) en java.time.zone.zonerulesprovider.getRules (zonerulesprovider.Java:227) en Java. Time.zoneregy.ofid (zonegegy.java:120) en java.time.zoneid.of (zoneid.java:403) en java.time.zoneid.o f (zoneid.java: 351)
Así como el día mes expresa un día duplicado, Yearmonth es otra combinación. Puede usar esta clase para averiguar cuántos días ese mes, longitudfonth () este método devuelve cuántos días es este año de la instancia de Month, lo cual es muy útil para verificar si fueron 28 días en febrero o 29 días.
Yearmonth CurrentyEarmonth = Yearmonth.Now (); ;
Esto no es complicado. Si aún desea repetir la rueda, puede ver este código.
if (Today.eSeApyEar ()) {System.out.println ("Este año es el año salto");Puede verificar durante unos años para ver si los resultados son correctos.
Otra tarea común es calcular cuántos días, cuántas semanas o años se incluyen entre las dos fechas dadas. Puede usar la clase Java.Time. En el siguiente ejemplo, calcularemos un total de varios meses antes de la fecha actual y la fecha futura.
Localdate java8release = localdate.of (2014, mes.march, 14); ));
Se puede ver que este mes es enero, y la fecha de lanzamiento del Java 8 es marzo, por lo que tiene 2 meses de diferencia.
En Java 8, puede usar la clase ZoneOffset para representar una cierta zona horaria. Mientras obtenga este desplazamiento, puede usar LocalDateTime y este desplazamiento para crear un OfficeTatetime.
LocalDaletime Dotetime = LocalDateTime.of (2014, mes. Enero, 14, 19, 30); .println ("Fecha y hora con compensación de zona horaria en Java:" + Fecha);Se puede ver que la fecha actual está asociada con la zona horaria. Otro punto es que la máquina entiende principalmente la máquina de OfficeTDateTetet.
Si aún recuerda cómo obtener la marca de tiempo actual antes de Java 8, entonces esto es simplemente un plato pequeño. La clase instantánea tiene un método de fábrica estática ahora () para devolver la marca de tiempo actual, de la siguiente manera:
Instant TimeStamp = Instant.Now ();
Se puede ver que la marca de tiempo actual incluye la fecha y la hora, que es similar a java.util.date. en java.util.date, y date.toinstant () convierte la fecha en instante.
Antes de Java 8, el formato de la fecha de tiempo es un trabajo técnico. Gracias a las variables locales del hilo, lo ha hecho útil en un entorno múltiple, pero ha pasado mucho tiempo para que Java mantenga este estado. Esta vez introdujo un nuevo formato de fecha y hora de seguridad de hilo. También viene con algún formato predeterminado, que contiene el formato de fecha de uso común. Por ejemplo, en este ejemplo, utilizamos el formato de fecha ISO básico predefinido, que se formateará el 14 de febrero de 2014 a 20140114.
String dayafterTommorrow = "20140116"; -16
Puede ver que la fecha de generación coincide con el valor de la cadena especificada, que es ligeramente diferente en el formato de fecha.
En el ejemplo anterior, utilizamos el formato de hora y fecha construido para resolver la cadena de fecha. Por supuesto, el formato predeterminado es realmente bueno, pero a veces es posible que aún necesite usar un formato de fecha personalizado. El formato de fecha en este ejemplo es "mmm dd yyyy". Puede pasar el método Static () de Pattern al método Static () de DateTimeFormatter's. Por ejemplo, M todavía representa el mes, y M todavía está dividido. El modo no válido lanzará anomalías de DataTimeParseException, pero si son errores lógicos, por ejemplo, debe usarse como M cuando M, por lo que no hay forma.
String Goodfriday = "Abr 18 de 2014"; ", Goodfriday, Holiday);} Catch (DatTeTImeParsexception ex) {System.out.printf ("%s no es parsable!%N ", Goodfriday); Ex.PrintStacktr Ace ();} Salida: Cadena de abril de 2014 de ABR 18 de 2014 con éxito , La fecha es 2014-04-18Se puede ver que el valor de la fecha es realmente consistente con la cadena que pasa, pero el formato es diferente.
En los dos ejemplos anteriores, aunque utilizamos la clase de DaTetimeFormatter, analizamos principalmente la cadena de fecha. En este ejemplo, lo que tenemos que hacer es exactamente lo contrario. Aquí tenemos una instancia de la clase LocalDateTime, y queremos convertirlo en una cadena de fecha formateada. Esta es la forma más simple y conveniente de convertir la fecha en una cadena en Java hasta ahora. El siguiente ejemplo devolverá una cadena formateada. Al igual que el ejemplo anterior, aún necesitamos usar la cadena de modo especificada para crear una instancia de la clase DatetimeFormatter, pero el método de análisis de la clase LocalDate no lo es, sino su método Format (). Este método devolverá una cadena que representa la fecha actual, y el modo correspondiente es el definido en la instancia de DateTimeFormatter que se introduce.
LocalDaletime ArrivalDate = localDateTime.Now (); System.out.printf ("%s no se puede formatearse!%n", llegada);Se puede ver que la hora actual está representada por el modo "mmm dd yyyy hh: mm a".
Después de leer estos ejemplos, creo que tiene una cierta comprensión del nuevo conjunto de tiempo y fecha de Java 8. Ahora miramos hacia atrás en algunos de los elementos clave de esta nueva API.
Cada desarrollador de Java debe al menos comprender estas cinco categorías de estas nuevas API:
La bolsa principal de esta biblioteca es Java.Time, que contiene la clase, el tiempo, el tiempo instantáneo y la duración de la fecha representativa, la hora, el instantáneo y la duración. Tiene dos subcalicones, uno es Java.Time.foramt.
La zona horaria se refiere a áreas que comparten el mismo tiempo estándar en el planeta. Hay un identificador único en cada zona horaria, así como el formato de una región/ciudad (Asia/Tokio) y un tiempo de compensación a partir de la hora de Greenwich. Por ejemplo, el tiempo de compensación de Tokio es +09: 00.
La clase OfficeDetette en realidad contiene LocalDateTime y ZoneOffset. Se usa para indicar una fecha completa (+06: 00 o -08: 00) que contiene el desplazamiento de tiempo de Greenwita (+/- hora: puntos, como +06: 00 o -08: 00).
La clase DateTimeFormatter se utiliza para formatear y análisis de la fecha en Java. A diferencia de SimpleDateFormat, no cambia y es muy seguro. La clase de DateTimeFormatter proporciona muchos formatos prefensivos, y también puede personalizar el formato que desee. Por supuesto, según el acuerdo, también tiene un método de parse () para convertir la cadena en una fecha. Del mismo modo, la clase DateFormatter también tiene un método de formato () para la fecha de formato.
Digamos que los dos formatos de fecha de "Mmm d yyyy" y "mmm dd yyyy" también son ligeramente diferentes. En "2 de enero de 2014" informará un error porque espera que pasen dos caracteres en el mes. Para resolver este problema, en el caso del número de dígitos, debe compensar 0 al frente.
Esta se trata de la nueva fecha de tiempo de Java 8. Estos breves ejemplos son suficientes para comprender algunas de las nuevas API en esta nueva API. Dado que se explica en base a la tarea real, cuando se encuentra en Java, no es necesario buscar tiempo y fecha. Hemos aprendido a crear y modificar la fecha de tiempo. También entendemos las diferencias entre la fecha pura, la fecha de tiempo y la zona horaria de la zona horaria. Muchos días hay en el aniversario o el día del seguro. También hemos aprendido cómo analizar y formatear la fecha en el método de seguridad de los subprocesos en Java 8 sin tener que usar una variable local de subprocesos o una tercera biblioteca parcial. La nueva API es competente para cualquier tarea relacionada con la fecha de tiempo.
Si también está interesado en los tutoriales Java 8, puede echar un vistazo a los siguientes tutoriales:
Enlace original en inglés