Simplificando cálculos com datas com Joda Time – Java
21/fevereiro/2010 - Java
Olá!
Quem precisou fazer contas com java.util.Date ou java.util.Calendar saber o trabalho que dá e como a API nativa do Java (até o Java 6 pelo menos) não ajuda muito a fazer coisas simples como adicionar horas na data atual. A API Joda Time veio para simplificar o trabalho com datas no Java, tanto é que muitas idéias dessa API tem grande chance de estarem no Java 7 através da JSR-310.
O que eu mais gostei do Joda Time são os método toString() que aceitam como parâmetro o padrão de formatação (não preciso criar mais SimpleDateFormat para formatar os benditos java.util.Date!!! parecido com o do C#), inicialização do objeto com String e o uso de interfaces fluentes.
Abaixo exemplos de uso.
- Inicialização do objeto com String
DateTime date = new DateTime("2010-2-21T20:19:45.000-03:00"); System.out.println(date.toString("dd/MM/yyyy HH:mm:ss"));
- Soma de dias escolhendo o ano
LocalDate localDate = new LocalDate(); LocalDate moreDays = localDate.withYear(2008).plusDays(8); System.out.println(moreDays.toString("dd/MM/yyyy")); // 29/02/2008
- Dia da semana por extenso
DateTime dateTime = new DateTime(); String dayOfMonth = dateTime.dayOfWeek().getAsText(); System.out.println(dayOfMonth); // Domingo
- Quantidade de dias entre um dia e outro
DateTime inicio = new DateTime(2010, 2, 21, 0, 0, 0, 0); DateTime fim = new DateTime(2010, 2, 22, 13, 30, 0, 0); System.out.println(Days.daysBetween(inicio, fim).getDays()); // 1 System.out.println(Hours.hoursBetween(inicio, fim).getHours()); // 37 System.out.println(Minutes.minutesBetween(inicio, fim).getMinutes()); // 2250
- Diferença de horas entre fusos horários.
DateTime agora = new DateTime(); DateTime saoPaulo = agora.withZoneRetainFields(DateTimeZone.forID("America/Sao_Paulo")); DateTime rioBranco = agora.withZoneRetainFields(DateTimeZone.forID("America/Rio_Branco")); DateTime japao = agora.withZoneRetainFields(DateTimeZone.forID("Asia/Tokyo")); DateTime londres = agora.withZoneRetainFields(DateTimeZone.forID("Europe/London")); System.out.println(Hours.hoursBetween(japao, saoPaulo).getHours()); System.out.println(Hours.hoursBetween(londres, saoPaulo).getHours()); System.out.println(Hours.hoursBetween(rioBranco, saoPaulo).getHours()); // Diferença de horas entre Japão e São Paulo: 12 // Diferença de horas entre Londre e São Paulo: 3 // Diferença de horas entre Rio Branco/AC e São Paulo: -1
Até mais,
Roberto