ORIGINAL: http://it.deepinmind.com/java/2015/03/17/20-examples-date-nndate-di-from-java8.html
Além das expressões Lambda, Stream e várias pequenas melhorias, o Java 8 também introduziu um novo conjunto de API de tempo e data. As datas de Java, calendários e processamento de tempo sempre foram criticados, especialmente ele decide definir java.util. Parece que o Java percebeu que precisa fornecer um melhor suporte para as funções de hora e data, o que também é uma coisa boa para a comunidade que está acostumada a usar o banco de dados do tempo Joda. A maior vantagem desta nova biblioteca de horas e data é que ela define alguns conceitos relacionados à hora e à data. e período. Ao mesmo tempo, também empresta algumas vantagens da biblioteca Joda, como distinguir entre pessoas e máquinas para distinguir a data do horário. O Java 8 ainda usa o sistema de calendário ISO e, diferentemente de seus antecessores, as classes no pacote Java.Time são inadequadas e thread -sheafe. A nova API de hora e data está localizada no pacote Java.Time.
A nova biblioteca também adiciona Zoneoffset e zoneou para fornecer melhor suporte para o fuso horário. Com o novo DateTimeFormatter, a análise e a formatação da data após a data se tornaram novas. Basta mencionar, eu estava escrevendo este artigo quando Java estava prestes a lançar esse novo recurso no momento, para que você descobrirá que o tempo no exemplo é no ano passado. Se você executar esses exemplos, os valores que eles retornam devem estar corretos.
Alguém me perguntou qual é a melhor maneira de aprender uma nova biblioteca? Minha resposta é usá -lo em projetos reais. Haverá uma variedade de necessidades em um projeto real, que promoverá os desenvolvedores a explorar e estudar esta nova biblioteca. Em suma, apenas a tarefa em si realmente promoverá você a explorar e aprender. A nova API de data e hora do Java 8 é a mesma. Para aprender esta nova biblioteca do Java 8, criei 20 exemplos orientados para a tarefa aqui. Vamos começar com uma tarefa simples. Dizendo que é dito que desenvolva uma aplicação de lembretes para descobrir uma data específica, como aniversário, aniversário de domingo, a próxima data da conta, quantos dias existem para a próxima data premium ou hora de expiração do cartão de crédito.
Há uma classe chamada LocalDate em Java 8, que pode ser usada para representar a data de hoje. Esta classe é um pouco diferente de java.util.date, porque contém apenas a data e não tem tempo. Portanto, se você precisar apenas indicar a data em vez de tempo, poderá usá -lo.
LocalDate Today = LocalDate.now ();
Você pode ver que ele cria hoje, mas não inclui informações de tempo. Ele também forma o formato de data e o produz.
A classe LocalDate fornece algumas maneiras muito convenientes de usar a data e outros atributos de data que podem ser usados para extrair. Usando esses métodos, você pode obter qualquer atributo de data necessário e não precisa mais usar uma classe como java.util.calendar:
LocalDate hoje = LocalDate.now (); ano, mês, dia);
Pode -se observar que é muito simples obter as informações anuais no Java 8. Ele só precisa usar o método getter correspondente, sem memória, muito intuitivo. Você pode compará -lo com a redação do mês e dia atuais em Java.
No primeiro exemplo, vemos que é muito simples gerar a data do dia através do método estático, mas através de outro método de fábrica muito útil localDate.Of (), você pode criar qualquer data. o ano, o mês, e depois retorna uma instância equivalente a LocalDate. Outra boa notícia sobre esse método é que ele não cometeu erros na API antes. O que você escreve aqui é o que você escreve aqui, por exemplo, no exemplo a seguir, representa 14 de janeiro, não há lógica oculta.
LocalDate DateOfBirth = LocalDate.Of (2010, 01, 14);
Pode -se observar que a data de criada é o que escrevemos, 14 de janeiro de 2014.
Falando sobre as tarefas reais de horário e data de processamento, na realidade, é comum verificar se duas datas são iguais. Muitas vezes, você pode encontrar se deve julgar se hoje é um dia especial, como aniversário, aniversário ou férias. Às vezes, você lhe dará uma data para poder verificar se é um certo dia. O exemplo a seguir o ajudará a concluir essas tarefas no Java 8. Como você pensa, o LocalDate reescrito o método igual para comparar a data, como mostrado abaixo:
LocalDate Date1 = LocalDate.of (2014, 01, 14); 2014-01-14 e Date1 2014-01-14 são a mesma data
Neste exemplo, nossa comparação duas datas são iguais. Ao mesmo tempo, se você receber uma string de data formatada no código, precisará resolvê -la como uma data antes de compará -la. Você pode comparar este exemplo para comparar a comparação anteriormente de Java e descobrirá que é muito melhor.
Há também uma tarefa prática relacionada à data de horário em Java para verificar os eventos duplicados. Se você trabalha em uma empresa de comércio eletrônico, haverá um módulo que enviará desejos de aniversário aos usuários e dará saudações em cada feriado importante, como Natal, Ação de Graças, na Índia, pode ser possível na Índia é Deepawali. Como determinar se é um festival ou um incidente repetido em Java? Use a aula do mês. Esta categoria é combinada por mês e não inclui informações anuais, o que significa que você pode usá -las para representar alguns dos dias que parecem repetidos a cada ano. Obviamente, existem algumas outras combinações, como a aula de um ano. Também é incapaz de alterar e encaixar com segurança como outros tipos na nova biblioteca do tempo e também é uma classe de valor. Vamos ver como usar o mês de dia para verificar uma data duplicada:
LocalDate DTEalday Birthday.of (2010, 01, 14); println ("Muitos muitos retornos felizes do dia !!");Embora o ano seja diferente, hoje é o dia do aniversário, então você verá uma bênção de aniversário na produção. Você pode ajustar a hora do sistema e executar o programa para ver se ele pode lembrá -lo quando o próximo aniversário é.
Isso é muito semelhante à data atual no primeiro exemplo. Desta vez, usamos uma aula chamada LocalTime. Aqui você também pode usar um método estático de fábrica agora () para obter o horário atual. O formato padrão é hh: mm: ss: nnn, e o nnn aqui são nanossegundos. Pode ser comparado com como obter o horário atual com o Java 8.
LocalTime Time = Localtime.now ();
Pode -se observar que o horário atual não inclui a data, porque o LocalTime tem apenas tempo e nenhuma data.
Muitas vezes precisamos aumentar o tempo futuro em cada minuto ou segundo. O Java 8 não apenas fornece classes inalteradas e de threads -sseafe, mas também fornece alguns métodos mais convenientes, como Plushours () para substituir o método Add Add () original. A propósito, esses métodos retornam uma referência a uma nova instância local, porque o LocalTime é imutável, não se esqueça de armazenar essa nova referência.
LocalTime Time = Localtime.now (); : 33.369
Você pode ver que, após 2 horas do horário atual, é 16: 33: 33.369. Agora você pode compará -lo a uma maneira antiga de adicionar ou reduzir a maneira antiga em Java. À primeira vista, você sabe de que maneira é melhor.
Isso é semelhante ao exemplo anterior das duas horas anteriores. LocalDate é usado para indicar a data sem tempo. Como o LocalDate também é imutável, qualquer operação de modificação retornará um novo exemplo; portanto, não se esqueça de salvá -lo.
LocalDate NextWeek = Today.Plus (1, Chronousit.weeks); IS: 2014-01-14 Data após 1 semana: 2014-01-21
Você pode ver qual é a data após 7 dias. Você pode usar esse método para aumentar um mês, um ano, uma hora, um minuto ou até dez anos, verificar a aula de Chronounit na API Java para obter mais opções.
Esta é a sequência do exemplo anterior. No exemplo acima, aprendemos a usar o método Plus () do LocalDate para aumentar a data da data, semana ou mês.
LocalDate Anterioryear = Today.Minus (1, Chronousit.Years); " + nextyear); saída: data antes de 1 ano: 2013-01-14 Data após 1 ano: 2015-01-14
Pode -se observar que há dois anos no total, um é 2013 e o outro é 2015, que é no ano anterior e depois de 2014.
O Java 8 vem com uma aula de relógio, você pode usá -lo para obter o tempo, data ou hora instantâneos atuais em um determinado fuso horário. Você pode usar o relógio para substituir o método System.CurrentTimeInmillis () e TimeZone.getDefault ().
// Retorna a hora atual com base no seu relógio do sistema e defina o UTC. .SystemDefaultZone ();
Você pode usar a data especificada para comparar com este relógio, por exemplo, como segue:
Classe pública myclass {relógio privado;Se você precisar lidar com as datas de diferentes fusos horários, isso é bastante conveniente.
Esta também é uma tarefa comum em projetos reais. Como você julga se uma certa data está na frente ou atrás de outra data, ou apenas igual? No Java 8, a classe LocalDate possui métodos ISBefore () e Isafter () que podem ser usados para comparar duas datas. Se a data do método de chamada for anterior à data fornecida, o método ISBefore () retornará true.
LocalDate Tomomrow = LocalDate.Of (2014, 1, 15); Ontem;
Pode -se observar que a data do Java 8 é relativamente simples. Não há necessidade de usar outra classe como o calendário para concluir tarefas semelhantes.
O Java 8 não apenas separa a data e a hora, mas também às vezes regiões. Já existem vários grupos relacionados aos fusos horários. É equivalente à classe GregorianCalendar antes do Java 8. Usando esta classe, você pode converter o horário local no tempo correspondente em outro fuso horário, como o exemplo a seguir:
// Data e hora com o fuso horário em Java 8 Zoneid America = ZoneId.of ("American/News"); Filho time: " + DataEndTimeInnewyork); saída: data e hora atuais em um fuso horário específico: 2014-01-14T16: 33.373-05: 00 [American/New_york]Pode ser comparado com o tempo para converter o horário local em tempo GMT. A propósito, como antes do Java 8, o texto no fuso horário correspondente não deve ser enganado; caso contrário, você encontrará essa exceção:
Exceção em thread "main" java.time.zone.ZonerSexception: ID da zona de tempo desconhecida: Ásia/Tóquio em lesprovider.java:272) em java.Time.ZONE.ZONERULESPROVER.GETRULES (ZANERULESPROVIDER.JAVA:227). time.zoneregy.ofid (zoneregy.java:120) em java.time.zoneid.of (zoneid.java:403) em java.time.zoneid.o f (zoneid.java: 351)
Assim como o mês expressa um dia duplicado, o ano é outra combinação. Você pode usar esta classe para descobrir quantos dias naquele mês, Lengthmonth () esse método retorna quantos dias esta instância de um ano é, o que é muito útil para verificar se foram 28 dias em fevereiro ou 29 dias.
ANO Monthreia de ArentIdiússia = ANO ANO (); ;
Isso não é complicado. Se você ainda deseja repetir a roda, pode ver esse código. Esta é a lógica de julgar se um determinado ano é julgado por Java.
if (Today.isleApyear ()) {System.out.println ("Este ano é o ano bisneto");Você pode verificar alguns anos para ver se os resultados estão corretos.
Outra tarefa comum é calcular quantos dias, quantas semanas ou anos são incluídos entre as duas datas. Você pode usar a classe Java.Time. No exemplo a seguir, calcularemos um total de vários meses antes da data atual e da data futura.
LocalDate Java8Release = LocalDate.Of (2014, Month.March, 14); ));
Pode -se observar que este mês é janeiro e a data de lançamento do Java 8 é março, então é de 2 meses de diferença.
No Java 8, você pode usar a classe Zoneoffset para representar um determinado fuso horário. Contanto que você seja compensado, você pode usar o LocalDateTime e esse deslocamento para criar um OfficeTateTime.
LocalDalETime DoteTime = LocalDateTime.of (2014, Mês.January, 14, 19, 30); .println ("Data e hora com o deslocamento do fuso horário em Java:" + Data);Pode -se observar que a data atual está associada ao fuso horário. Outro ponto é que o OfficetDateTime é entendido principalmente pela máquina.
Se você ainda se lembra de como obter o carimbo de hora atual antes do Java 8, este é simplesmente um prato pequeno. A classe instantânea tem um método de fábrica estática agora () para retornar o registro de data e hora atual, como segue:
Timestamp instantâneo = instant.now ();
Pode -se observar que o registro de data e hora atual inclui a data e a hora, que é semelhante ao java.util.date. em java.util.date e date.ToiStant () converte a data em instantâneo.
Antes do Java 8, a formatação da data de tempo é um trabalho técnico. Graças às variáveis locais do thread, ele o tornou útil em um ambiente multi -thread, mas já faz muito tempo para o Java manter esse estado. Desta vez, introduziu um novo formato de segurança e hora de segurança do thread. Ele também vem com algum formato predeterminado, que contém o formato de data comumente usado. Por exemplo, neste exemplo, usamos o formato básico de data predefinido do ISO , que será formatado em 14 de fevereiro de 2014 a 20140114.
String DayAfterTomMorrow = "20140116"; -16
Você pode ver que a data da geração é comparada com o valor da sequência especificada, que é um pouco diferente no formato da data.
No exemplo acima, usamos o formato de tempo e data construído para resolver a string de data. Obviamente, o formato predeterminado é realmente bom, mas às vezes você ainda pode precisar usar um formato de data personalizado. O formato de data deste exemplo é "mmm dd yyyy". Você pode passar o método estático do Pattern () para o método estático do Pattern () do DateTimeFormatter, e ele retornará uma instância. Por exemplo, M ainda representa o mês e M ainda está dividido. O modo inválido lançará as anomalias do DateTimePeException, mas se houver erros lógicos, por exemplo, ele deve ser usado como m quando m, para que não haja jeito.
String goodfriday = "abr 18 2014"; ", Goodfriday, Holiday);} Catch (DateTimeParsexception ex) {System.out.printf ("%s não é parsável!%n ", Goodfriday); Ex.PrintStacktr ACE ();} saída: String com sucesso 18 de abril de 2014 2014 , Data é 2014-04-18Pode -se observar que o valor da data é realmente consistente com a sequência de passagem, mas o formato é diferente.
Nos dois exemplos anteriores, embora tenhamos usado a classe DateTimeFormatter, analisamos principalmente a string de data. Neste exemplo, o que precisamos fazer é exatamente o oposto. Aqui temos uma instância da classe LocalDateTime e queremos convertê -la em uma string de data formatada. Esta é a maneira mais simples e conveniente de converter a data em uma string em Java até agora. O exemplo a seguir retornará uma string formatada. Como o exemplo anterior, ainda precisamos usar a sequência de modo especificada para criar uma instância da classe DateTimeFormatter, mas o método parse da classe LocalDate não é, mas seu método format (). Este método retornará uma sequência que representa a data atual e o modo correspondente é o definido na instância DateTimeFormatter que é introduzida.
LocalDalETime ArrivalDate = LocalDateTime.now (); System.out.printf ("%S não pode formatar!%n", ArrivalDate);Pode -se observar que o horário atual é representado pelo modo "mmm dd yyyy hh: mm a".
Depois de ler esses exemplos, acredito que você tem um certo entendimento do novo conjunto de tempo e data do Java 8. Agora, olhamos para alguns dos elementos -chave desta nova API.
Cada desenvolvedor Java deve pelo menos entender essas cinco categorias dessas novas APIs:
A bolsa principal desta biblioteca é Java.Time, que contém a classe, o tempo, instantânea e a duração da data representativa, hora, instantânea e duração. Possui dois sub -package, um é Java.Time.foramt.
O fuso horário refere -se a áreas que compartilham o mesmo tempo padrão no planeta. Existe um identificador único em cada fuso horário, bem como no formato de uma região/cidade (Ásia/Tóquio) e um tempo de deslocamento a partir do tempo de Greenwich. Por exemplo, o tempo de deslocamento de Tóquio é +09: 00.
A classe OfficedateTime realmente contém o LocalDateTime e o Zoneoffset. É usado para indicar uma data completa (+06: 00 ou -08: 00) que contém o deslocamento de tempo de Greenwita (+/- hora: pontos, como +06: 00 ou -08: 00)
A classe DateTimeFormatter é usada para formatação e análise da data em Java. Ao contrário do SimpleDateFormat, ele é inalterado e seguro. A classe DateTimeFormatter fornece muitos formatos pré -definidos e você também pode personalizar o formato desejado. Obviamente, de acordo com o contrato, ele também possui um método parse () para converter a string em uma data. Da mesma forma, a classe DateFormatter também possui um método Format () para a data de formatação.
Digamos que os dois formatos de data de "mmm d yyyy" e "mmm dd yyyy" também são um pouco diferentes. Em "2 de janeiro de 2014", reportará um erro porque espera que dois caracteres passem no mês. Para resolver esse problema, no caso do número de dígitos, você deve compensar 0 na frente.
É sobre a nova data de horário do Java 8. Esses breves exemplos são suficientes para entender algumas das novas APIs nesta nova API. Como é explicado com base na tarefa real, quando é encontrada em Java, não é necessário procurar tempo e data. Aprendemos como criar e modificar a data do tempo. Também entendemos as diferenças entre a data pura, a data da hora e o fuso horário do fuso horário. Muitos dias existem no dia do aniversário ou no seguro. Também aprendemos a analisar e formatar a data no método de segurança do thread em Java 8 sem precisar usar uma variável local de thread ou uma terceira biblioteca de partidos. A nova API é competente para qualquer tarefa relacionada à data de tempo.
Se você também estiver interessado nos tutoriais do Java 8, pode dar uma olhada nos seguintes tutoriais:
Link original em inglês