Desde o lançamento do Java 8 em 2014, nosso antigo java.util.date finalmente não é mais a única opção para datas e tempo de operação em Java.
De fato, as APIs relacionadas de data e hora em Java sempre foram criticadas pelo mundo. Não é apenas apenas porque sua divisão de design não está clara, mas geralmente pode lidar com datas e tempo, o que é muito confuso. Também mapeamentos numéricos de certos anos, meses e datas são armazenados contra seres humanos, como: 0 corresponde a mês de janeiro, 11 corresponde a mês de dezembro, 118 corresponde ao ano de 2018 (1900 + 118), etc.
Freqüentemente, quando obtemos um certo valor de ano e mês, precisamos fazer operações correspondentes para obter informações precisas de ano, mês e data. Até o nosso Java 8, emprestamos o excelente design da biblioteca de código aberto de terceiros Joda-Time e redesenhamos uma API de data e hora. Comparado com o anterior, pode -se dizer que é cem vezes mais fácil de usar. Todas as interfaces de API relacionadas estão localizadas no pacote Java.Time.
Interface de data e hora antiga
Data representando as informações de tempo
Todos os computadores do mundo usam um número inteiro do tipo longo, e o valor desse número inteiro é o número de milissegundos em relação ao GMT no Reino Unido (0: 0: 00, 1 de janeiro de 1970). Por exemplo:
public static void main (string [] args) {// 1 de janeiro de 1970 00:00:00 gmt. Data data = nova data (1000); System.out.println (data);}Resultado da saída:
// 1970-1-1 8: 00: 01thu Jan 01 08:00:01 CST 1970
Muitas pessoas podem se perguntar, 1000 significa 1 segundo antes do horário padrão, então por que o tempo passa oito horas mais?
Isso tem algo a ver com o "fuso horário". Se você estiver localizado em Greenwich, o resultado será o esperado, mas estamos localizados no oitavo distrito leste da China, e o tempo é oito horas antes, portanto, os valores básicos baseados em diferentes fusos horários são diferentes.
A classe de data realmente já desempenhou muitos papéis antes. Pode ser visto em seu código -fonte que existem métodos que podem operar tempo, métodos que podem operar ano, mês e dia e até gerenciar fusos horários. Pode -se dizer que basta tê -lo apenas nas operações relacionadas a data e hora.
Mas este é o mundo. Se você se preocupa demais, naturalmente não será capaz de cobrir tudo. O design de muitos métodos em data não é muito razoável. Também já dissemos isso antes, e é um pouco anti-humano. Portanto, quase 80% dos métodos na classe de data atual foram abandonados e estão marcados @Deprecated.
O posicionamento atual da Sun Company para a data é representar apenas um momento; portanto, sua posição interna deve girar em torno dos milissegundos desse número inteiro e não se concentrar mais em vários fusos horários anuais do calendário e outras informações.
A data permite que um objeto seja instanciado por meio de dois construtores:
FASTTIMENTO DE LONGO DA PRIVENTE PRIVADO; Public Date () {this (System.currenttimemillis ());} public data (longa data) {fasttime = date;}O atributo FastTime aqui armazena o número de milissegundos correspondentes ao tempo. Os dois construtores ainda são muito simples. Se o construtor sem parâmetros for chamado, a máquina virtual atribuirá o FastTime ao valor de tempo atual do sistema.
Existem alguns outros métodos que não foram descartados:
Existem outros dois métodos que são adicionados recentemente ao JDK1.8 depois e são usados para converter novas interfaces em Java 8, que serão introduzidas posteriormente.
Calendário descrevendo o almanaque
O calendário é usado para representar informações de data como ano, mês, dia etc. É uma classe abstrata; portanto, seu objeto de instância é geralmente obtido pelos quatro métodos de fábrica a seguir.
Calendário estático público getInstance () calendário estático público getinstance (zona horária) calendário estática pública GetInstance (alocale da localidade) Calendário estático público GetInstance (zona do fuso horário, alocale local)
De fato, o mesmo método interno será chamado:
Calendário estático privado CreateCalendar (zona do fuso horário, alocale local)
Este método requer dois parâmetros, um é o fuso horário e o outro é o país e o idioma. Ou seja, a criação de uma instância do calendário requer pelo menos essas informações de dois parâmetros, caso contrário, o fuso horário padrão do sistema ou as informações do idioma serão usadas.
Como os diferentes fusos horários e os idiomas nacionais geram de maneira diferente para informações sobre tempo e ano, mês e dia, essa também é uma razão pela qual uma instância do calendário deve passar nas informações do fuso horário e no país. Veja um exemplo:
public static void main (string [] args) {calendário calendário = calendar.getInstance (); System.out.println (calendar.gettime ()); Calendário calendário1 = calendário.getInstance (timezone.getTimeZone ("gmt"), loce.english); System.out.println (calendar1.get (calendar.year) + ":" + calendar1.get (calendar.hour) + ":" + calendar1.get (calendar.minute)); }Resultado da saída:
Sáb 21 de abril 10:32:20 CST 20182018: 2: 32
Como você pode ver, a primeira saída é a hora atual do fuso horário padrão do nosso sistema e do país, e a segunda instância do calendário especificamos que está localizado no fuso horário de Greenwich (fuso horário de 0), e o resultado também é óbvio, com uma diferença de oito horas, porque estamos localizados no leste oitavo, oito horas antes da zona de 0 tempo.
Algumas pessoas podem se perguntar por que a saída da segunda instância do calendário é tão complicada de emenda, em vez de chamar o método GetTime diretamente conciso, como a primeira instância do calendário?
Isso envolve a implementação interna do calendário, vamos dar uma olhada juntos:
Protegido Longo tempo; Data final pública getTime () {Return New Date (gettimeInmillis ());}Como a data, o calendário mantém uma informação de tempo dentro, e o método getTime realmente cria um objeto de data com base nesse horário e retorna.
Geralmente, quando construímos uma instância do calendário, não passaremos em uma informação de tempo; portanto, quando a instância for inicializada, o programa calculará um número de milissegundos com base no fuso horário padrão do sistema e no horário atual e o atribui ao horário.
Portanto, dentro de todas as instâncias do calendário cujo valor de atributo de tempo não foi modificado manualmente, o valor do tempo é o valor do tempo do fuso horário padrão naquele momento. Em outras palavras, o resultado da saída do getTime ignora as informações do fuso horário correspondentes à instância atual. Essa também é uma falha no design do calendário, porque fará com que o valor de saída do getTime das duas instâncias do calendário dependa apenas do tempo de execução do sistema quando a instância for inicializada.
O calendário também define muitas constantes estáticas e algumas matrizes de atributos:
public final estático int ERA = 0; public final estático int ano = 1; public final estático no mês = 2; public final static int week_of_year = 3; public final static int week_of_month = 4; public final static int date = 5; ... .... ....
Todas as informações relevantes sobre as datas são armazenadas na matriz de atributos, e os valores dessas constantes estáticas geralmente representam um valor de índice. Através do método GET, passamos um índice de atributo e retornamos o valor do atributo. Por exemplo:
Calendário mycalendar = calendar.getInstance (); int ano = mycalendar.get (calendar.year);
O método get aqui é realmente tomar diretamente os campos [1] como o valor de retorno. A matriz de atributos dos campos é calculada e atribuída pelo sistema de acordo com o fuso horário e o idioma quando a instância do calendário for inicializada. Observe que ele será calculado com base no fuso horário que você especificou, diferentemente do tempo, que sempre é baseado no fuso horário padrão do sistema.
Pessoalmente, acho que o design do calendário tem aspectos elegantes e irracionais. Afinal, é uma "antiguidade" e acabará sendo substituída.
DateFormat Format Conversão
Como podemos ver em um de nossos exemplos anteriores, é muito problemático as informações da data de saída em um formato esperado para o calendário e precisa ser unido manualmente. Nosso DateFormat é usado para lidar com a conversão entre strings formatados e vezes.
Como o calendário, o DateFormat também é uma classe abstrata. Precisamos gerar seu objeto de instância através de métodos de fábrica. Existem principalmente os seguintes métodos de fábrica:
// Somente a conversão do tempo de processo public final estático dateFormat getTimeInstance () // Somente Data de processo Data Public Final Static DateFormat GetDateInstance () // Você pode lidar com o tempo e a data final estática dateFormat GetDateTimeInstance ()
Obviamente, cada um deles tem seus próprios métodos de sobrecarga e veremos os detalhes posteriormente.
Existem dois tipos de métodos para DateFormat, Format and Parse.
Formato de String Public final (data) Data do público Parse (fonte da string)
O método do formato é usado para formatar um objeto de data como uma string, e o método Parse é usado para substituir uma string formatada por um objeto de data. Por exemplo:
public static void main (string [] args) {calendário calendário = calendar.getInstance (); DateFormat DateFormat = DateFormat.GetDateTimeInstance (); System.out.println (DateFormat.Format (calendar.gettime ());}Resultado da saída:
2018-4-21 16:58:09
Obviamente, uma instância do DateFormat construída em fábrica não pode personalizar o conteúdo de formatação de saída, ou seja, o formato da string de saída é fixo e não pode atender às necessidades especiais em alguns casos. Geralmente, usaremos diretamente uma de suas classes de implementação, SimpleDateFormat.
SimpleDateFormat permite passar um parâmetro de padrão ao construir uma instância para personalizar o formato de saída dos caracteres da data. Por exemplo:
public static void main (string [] args) {dateFormat dateFormat = new SimpleDateFormat ("AA YYYYY ANO MM Mês DD DIA"); System.out.println (DateFormat.Format (new Date ()));}Resultado da saída:
21 de abril de 2018
em,
Obviamente, também é muito conveniente converter datas de string. Os modos personalizados são permitidos, mas você deve cumprir os padrões definidos por si mesmo, caso contrário, o programa não poderá analisar com sucesso. Por exemplo:
public static void main (string [] args) {string str = "Sábado, 21 de abril de 2018"; DateFormat sdateFormat = new SimpleDateFormat ("AA YYYY ANO M Mês DD DIA HH PONTO MM PONTO E"); sdateFormat.parse (str); System.out.println (sdateFormat.getCalendar (). Gettime ());}Resultado da saída:
Sáb 21 de abril 17:17:00 CST 2018
Obviamente, o programa está analisando corretamente nossa string e convertendo -a em um objeto de calendário armazenado dentro do DateFormat.
Em geral, data, calendário e DateFormat foram capazes de lidar com questões gerais de tempo e data, mas inevitavelmente, elas ainda são pesadas e difíceis de usar.
Devido às limitações do espaço, compararemos a nova API de data e hora do Java 8 no próximo artigo e você descobrirá que ele possui um design mais elegante e uma operação simples.