Desde el lanzamiento de Java 8 en 2014, nuestra antigua java.util.date finalmente ya no es la única opción para operar fechas y tiempo en Java.
De hecho, las API y la hora relacionadas en Java siempre han sido criticadas por el mundo. No solo es no solo porque su división de diseño no está clara, sino que a menudo puede manejar las fechas y el tiempo, lo cual es muy confuso. También se almacenan mapeos numéricos de ciertos años, meses y fechas contra humanos, como: 0 corresponde al mes de enero, 11 corresponde al mes de diciembre de 118 corresponde al año 2018 (1900 + 118), etc.
A menudo, cuando obtenemos un cierto valor de año y mes, debemos realizar operaciones correspondientes para obtener información precisa de año, mes y fecha. Hasta nuestro Java 8, tomamos prestado el excelente diseño de la biblioteca de código abierto de terceros, y rediseñamos una API de fecha y hora. En comparación con el anterior, se puede decir que es cien veces más fácil de usar. Todas las interfaces API relacionadas se encuentran en el paquete java.time.
Interfaz de fecha y hora antigua
Fecha de representación de la información de tiempo
Todas las computadoras en el mundo usan un entero de tipo largo, y el valor de este entero es el número de milisegundos en relación con GMT en el Reino Unido (0: 0: 00, 1 de enero de 1970). Por ejemplo:
Public static void main (String [] args) {// 1 de enero de 1970 00:00:00 GMT. Fecha fecha = nueva fecha (1000); System.out.println (fecha);}Resultado de salida:
// 1970-1-1-1 8: 00: 01thu 01 01 08:00:01 CST 1970
Muchas personas pueden preguntarse, 1000 significa 1 segundo antes del tiempo estándar, entonces, ¿por qué pasa el tiempo ocho horas más?
Esto tiene algo que ver con la "zona horaria". Si se encuentra en Greenwich, el resultado será el esperado, pero estamos ubicados en el East Octavo Distrito de China, y el tiempo es ocho horas antes, por lo que los valores básicos basados en diferentes zonas horarias son diferentes.
La clase de fecha realmente ha jugado muchos roles antes. Se puede ver en su código fuente que hay métodos que pueden operar tiempo, métodos que pueden operar año, mes y día e incluso administrar zonas horarias. Se puede decir que es suficiente tenerlo solo en las operaciones relacionadas con la fecha y la hora.
Pero este es el mundo. Si te importa demasiado, naturalmente no podrás cubrir todo. El diseño de muchos métodos en la fecha no es muy razonable. También lo hemos dicho antes, e incluso es un poco antihumano. Por lo tanto, casi el 80% de los métodos en la clase de fecha actual han sido abandonados y están marcados @Depreced.
El posicionamiento actual de Sun Company para la fecha es representar solo un momento, por lo que su posición interna debería girar en torno a los milisegundos de ese entero, y ya no centrarse en varias zonas de tiempo calendario anual y otra información.
La fecha permite que un objeto sea instanciado a través de dos constructores:
Private Transient Long Fasttime; public date () {this (System.CurrentTimemillis ());} Fecha pública (fecha larga) {Fasttime = date;}El atributo de tiempo rápido aquí almacena el número de milisegundos correspondientes a la hora. Los dos constructores siguen siendo muy simples. Si se llama al constructor sin parámetros, la máquina virtual asignará a tiempo rápido con el valor de tiempo actual del sistema.
Hay algunos otros métodos que no se han descartado:
Hay otros dos métodos que se agregan recientemente a JDK1.8 después, y se utilizan para convertir nuevas interfaces a Java 8, que se introducirán más adelante.
Calendario que describe el almanaque
El calendario se utiliza para representar información de fecha como año, mes, día, etc. Es una clase abstracta, por lo que su objeto de instancia generalmente se obtiene a través de los siguientes cuatro métodos de fábrica.
Calendario estático público GetInstance () Público Calendario estático GetInstance (zona horaria) Calendario estático público GetInstance (Locale Alocale) Calendario estático público GetInstance (zona horaria, locale alocale)
De hecho, eventualmente se llamará al mismo método interno:
Calendario estático privado CreateCalendar (zona horaria, localidad alocale)
Este método requiere dos parámetros, uno es la zona horaria y el otro es el país y el idioma. Es decir, construir una instancia de calendario requiere al menos estas dos información de parámetros, de lo contrario se utilizará la zona horaria o la información del idioma predeterminada del sistema.
Debido a que las diferentes zonas horarias y los idiomas nacionales producen de manera diferente para la información de época y año, mes y día, esta es una razón por la cual una instancia de calendario debe pasar en la información de la zona horaria y del país. Ver un ejemplo:
public static void main (string [] args) {calendar calendar = calendar.getInstance (); System.out.println (calendar.gettime ()); Calendario calendario1 = calendario.getInstance (TimeZone.gettimezone ("GMT"), locale.English); System.out.println (calendar1.get (calendar.year) + ":" + calendar1.get (calendar.hour) + ":" + calendar1.get (calendar.minute)); }Resultado de salida:
Sábado 21 de abril 10:32:20 CST 20182018: 2: 32
Como puede ver, la primera salida es la hora actual de la zona horaria predeterminada de nuestro sistema y el país, y la segunda instancia de calendario que especificamos que se encuentra en la zona horaria de Greenwich (zona horaria de 0), y el resultado también es obvio, con una diferencia de ocho horas, porque estamos ubicados en el East Octavo, que es ocho horas antes que la zona horaria de 0.
Algunas personas pueden preguntarse por qué la salida de la segunda instancia de calendario es tan complicada para empalmar, en lugar de llamar al método GetTime directamente conciso como la primera instancia de calendario.
Esto implica la implementación interna del calendario, echemos un vistazo juntos:
Protegido mucho tiempo; Fecha final pública getTime () {return nueva fecha (getTimeInmillis ());}Al igual que la fecha, el calendario mantiene una información de tiempo dentro, y el método GetTime en realidad crea un objeto de fecha basado en este tiempo y devoluciones.
En general, cuando construimos una instancia de calendario, no pasaremos en una información de tiempo, por lo que cuando se inicialice la instancia, el programa calculará un número de milisegundos en función de la zona horaria predeterminada del sistema y la hora actual y la asignará a la hora.
Por lo tanto, dentro de todas las instancias calendario cuyo valor de atributo de tiempo no se ha modificado manualmente, el valor de tiempo es el valor de tiempo de la zona horaria predeterminada en ese momento. En otras palabras, el resultado de salida de GetTime ignora la información de la zona horaria correspondiente a la instancia actual. Esto también es un defecto en el diseño del calendario, porque esto hará que el valor de salida de GetTime de las dos instancias calendario dependa solo del tiempo de ejecución del sistema cuando se inicialice la instancia.
El calendario también define muchas constantes estáticas y algunas matrices de atributos:
Public Final Static int ERA = 0; public Final Static int Year = 1; public Final Static int mes = 2; public Final Static int Week_of_year = 3; public Final Static int Week_OF_MONTH = 4; pública final estática INT date = 5; .... protegido int Fields []; Isset booleano protegido []; ... ... ...
Toda la información relevante sobre las fechas se almacena en la matriz de atributos, y los valores de estas constantes estáticas a menudo representan un valor de índice. A través del método GET, pasamos un índice de atributos y devolvemos el valor del atributo. Por ejemplo:
Calendario mycalendar = calendar.getInstance (); int año = myCalendar.get (calendar.year);
El método GET aquí es en realidad tomar directamente los campos [1] como el valor de retorno. El sistema calcula y asigna la matriz de atributos de los campos de acuerdo con la zona horaria y el idioma cuando se inicializa la instancia del calendario. Tenga en cuenta que se calculará en función de la zona horaria que especificó, a diferencia del tiempo, que siempre se basa en la zona horaria predeterminada del sistema.
Personalmente, creo que el diseño del calendario tiene aspectos elegantes e irrazonables. Después de todo, es una "antigua" y eventualmente será reemplazado.
Conversión de formato dateFormat
Como podemos ver en uno de nuestros ejemplos anteriores, es muy problemático generar información de fecha en un formato esperado para el calendario y debe empalmarse manualmente. Nuestro dateFormat se utiliza para manejar la conversión entre cadenas formateadas y a veces.
Al igual que el calendario, DateFormat también es una clase abstracta. Necesitamos generar su objeto de instancia a través de métodos de fábrica. Existen principalmente los siguientes métodos de fábrica:
// Solo la conversión de tiempo de proceso Público Final DateFormat GetTimeInstance () // Solo Fecha de proceso Conversión pública Final DateFormat getDateInStance () // Puede manejar tanto la hora como la fecha pública Final FinalFormat getDateTimeInstance ()
Por supuesto, cada uno tiene sus propios métodos de sobrecarga, y veremos los detalles más adelante.
Existen dos tipos de métodos para Datformat, formato y analizador.
Formato de cadena final pública (fecha Fecha) Fecha pública Parse (fuente de cadena)
El método de formato se utiliza para formatear un objeto de fecha como una cadena, y el método de análisis se usa para reemplazar una cadena formateada con un objeto de fecha. Por ejemplo:
public static void main (string [] args) {calendar calendar = calendar.getInstance (); DateFormat dateFormat = dateFormat.getDateTimeInstance (); System.out.println (dateFormat.Format (calendar.gettime ()));}Resultado de salida:
2018-4-21 16:58:09
Obviamente, una instancia de formato de fecha construida en fábrica no puede personalizar el contenido de formato de salida, es decir, el formato de cadena de salida se fija y no puede satisfacer las necesidades especiales en algunos casos. En general, usaremos directamente una de sus clases de implementación, SimpleDateFormat.
SimpleDateFormat le permite pasar un parámetro de patrón al construir una instancia para personalizar el formato de salida de los caracteres de fecha. Por ejemplo:
public static void main (string [] args) {dateFormat dateFormat = new SimpleDateFormat ("yyyyy año mm mes dd day"); System.out.println (dateFormat.Format (nuevo date ()));}Resultado de salida:
21 de abril de 2018
en,
Por supuesto, también es muy conveniente convertir las fechas de la cadena. Se permiten modos personalizados, pero debe cumplir con los patrones que establece usted mismo, de lo contrario, el programa no podrá analizar con éxito. Por ejemplo:
public static void main (String [] args) {String str = "Sábado, 21 de abril de 2018"; DateFormat sdateFormat = new SimpleDateFormat ("Yyyy año M mes dd día hh punto mm punto e"); sdateFormat.Parse (STR); System.out.println (sdateformat.getCalendar (). GetTime ());}Resultado de salida:
Sábado 21 de abril 17:17:00 CST 2018
Obviamente, el programa analiza correctamente nuestra cadena y la convierte en un objeto calendario almacenado dentro de DateFormat.
En general, la fecha, el calendario y la formación de fecha han podido manejar los problemas generales de hora y fecha, pero inevitablemente, todavía son engorrosos y difíciles de usar.
Debido a las limitaciones de espacio, compararemos la nueva API de fecha y hora de Java 8 en el próximo artículo, y encontrará que tiene un diseño más elegante y una operación simple.