Boa tarde pessoal, pensando em um problema comum, no qual já me deparei varias vezes, que é a subtração entre datas, fazendo algumas pesquisas aqui no forum vi que o pessoal tem dificuldades para realizar tais operações com Date que já tem muitos métodos depreciados e com Calendar, também vi que tinham dificuldades para aprender a JodaTime, pensando nisso resolvi criar uma classe DateUtil, com alguns métodos basicos para a manipulação das mesmas espero que ajude, aceito sugestões e e criticas, quem quizer opinar sobre criar mais métodos e funcionalidades, fiquem avontade.
Obs: Só foi possivel tal realização graças a JodaTime:
Vamos a Classe DateUtil:
package DateUtil;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.joda.time.DateTime;
import org.joda.time.Years;
/**
*
* @author rafael.cassau
*
*/
public class DateUtil {
private DateUtil(){
}
/**
* obterDiferencaEntreAnos(Date dataAtual, Date dataAnterior)
*
* <br/><br/> A precisão para a realização do calculo é de até segundos <br/><br/>
*
* @param dataAtual - Representa a data posterior a (dataAnterior) e sempre deve ser maior ou igual a mesma
* @param dataAnterior - Representa a data anterior a (dataPosterior) e sempre deve ser menor ou igual a mesma
* @return Retorna um inteiro que representa a diferença em anos entre as datas,
* o resultado é obtido através da subtração entre a (dataAtual - dataAnterior)
*/
public static int obterDiferencaEntreAnos(Date dataAtual, Date dataAnterior){
Calendar anteriorDate = setCalendar(dataAnterior);
Calendar atualDate = setCalendar(dataAtual);
return obterDiferencaEntreAnos(atualDate, anteriorDate);
}
/**
* obterDiferencaEntreAnos(Calendar dataAtual, Calendar dataAnterior)
*
* <br/><br/> A precisão para a realização do calculo é de até segundos <br/><br/>
*
* @param dataAtual - Representa a data posterior a (dataAnterior) e sempre deve ser maior ou igual a mesma
* @param dataAnterior - Representa a data anterior a (dataPosterior) e sempre deve ser menor ou igual a mesma
* @return Retorna um inteiro que representa a diferença em anos entre as datas,
* o resultado é obtido através da subtração entre a (dataAtual - dataAnterior)
*/
public static int obterDiferencaEntreAnos(Calendar dataAtual, Calendar dataAnterior){
DateTime dataAtualDateTime = setDateTime(dataAtual);
DateTime dataAnteriorDateTime = setDateTime(dataAnterior);
return obterDiferencaEntreAnos(dataAtualDateTime, dataAnteriorDateTime);
}
/**
* obterDiferencaEntreAnos(DateTime dataAtual, DateTime dataAnterior)
*
* <br/><br/> A precisão para a realização do calculo é de até milisegundos <br/><br/>
*
* @param dataAtual - Representa a data posterior a (dataAnterior) e sempre deve ser maior ou igual a mesma
* @param dataAnterior - Representa a data anterior a (dataPosterior) e sempre deve ser menor ou igual a mesma
* @return Retorna um inteiro que representa a diferença em anos entre as datas,
* o resultado é obtido através da subtração entre a (dataAtual - dataAnterior)
*/
public static int obterDiferencaEntreAnos(DateTime dataAtual, DateTime dataAnterior){
return Years.yearsBetween(dataAnterior, dataAtual).getYears();
}
/**
* validarPeriodoEmAnos(Date dataAtual, Date dataAnterior, int ano)
*
* <br/><br/> A precisão para a realização do calculo é de até segundos <br/><br/>
*
* @param dataAtual - Representa a data posterior a (dataAnterior) e sempre deve ser maior ou igual a mesma
* @param dataAnterior - Representa a data anterior a (dataPosterior) e sempre deve ser menor ou igual a mesma
* @param ano - Representa o periodo em anos que deve conter entre as datas
* @return Retorna TRUE se a diferença entre as datas for maior ou igual ao parametro passado (referente ao ano),
* retorna FALSE se a diferença entre as datas for menos ou igual ao parametro passado (referente ao ano),
* o resultado é obtido através da subtração entre a (dataAtual - dataAnterior)
*/
public static boolean validarPeriodoEmAnos(Date dataAtual, Date dataAnterior, int ano){
return ano <= obterDiferencaEntreAnos(dataAtual, dataAnterior);
}
/**
* validarPeriodoEmAnos(Calendar dataAtual, Calendar dataAnterior, int ano)
*
* <br/><br/> A precisão para a realização do calculo é de até segundos <br/><br/>
*
* @param dataAtual - Representa a data posterior a (dataAnterior) e sempre deve ser maior ou igual a mesma
* @param dataAnterior - Representa a data anterior a (dataPosterior) e sempre deve ser menor ou igual a mesma
* @param ano - Representa o periodo em anos que deve conter entre as datas
* @return Retorna TRUE se a diferença entre as datas for maior ou igual ao parametro passado (referente ao ano),
* retorna FALSE se a diferença entre as datas for menos ou igual ao parametro passado (referente ao ano),
* o resultado é obtido através da subtração entre a (dataAtual - dataAnterior)
*/
public static boolean validarPeriodoEmAnos(Calendar dataAtual, Calendar dataAnterior, int ano){
return ano <= obterDiferencaEntreAnos(dataAtual, dataAnterior);
}
/**
* validarPeriodoEmAnos(DateTime dataAtual, DateTime dataAnterior, int ano)
*
* <br/><br/> A precisão para a realização do calculo é de até milisegundos <br/><br/>
*
* @param dataAtual - Representa a data posterior a (dataAnterior) e sempre deve ser maior ou igual a mesma
* @param dataAnterior - Representa a data anterior a (dataPosterior) e sempre deve ser menor ou igual a mesma
* @param ano - Representa o periodo em anos que deve conter entre as datas
* @return Retorna TRUE se a diferença entre as datas for maior ou igual ao parametro passado (referente ao ano),
* retorna FALSE se a diferença entre as datas for menos ou igual ao parametro passado (referente ao ano),
* o resultado é obtido através da subtração entre a (dataAtual - dataAnterior)
*/
public static boolean validarPeriodoEmAnos(DateTime dataAtual, DateTime dataAnterior, int ano){
return ano <= obterDiferencaEntreAnos(dataAtual, dataAnterior);
}
/* Método responsavel por retornar um GregorianCalendar que é uma instancia da implementação de Calendar encapsulando um objeto do tipo Date */
private static Calendar setCalendar(Date date){
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(date);
return calendar;
}
/* Método responsavel por retornar um instancia de DateTime encapsulando um objeto que implementa Calendar */
private static DateTime setDateTime(Calendar calendar){
return new DateTime(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));
}
}
é muito simples, usei um método na JodaTime que faz o trabalho pesado, só forneci uma API com métodos estaticos e publicos, abusei de sobrecarga, para que por parametro o cliente possa trabalhar tanto com Date, Calendar, ou DateTime, que é a classe responsavel por manipulação de datas da JodaTime.
abaixo vai uma classe de testes:
package DateUtil;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.joda.time.DateTime;
public class Principal {
public static void main(String[] args) {
Calendar anteriorCalendar = new GregorianCalendar(1989, 03, 20, 0, 0, 0);
Calendar atualCalendar = new GregorianCalendar(2007, 03, 20, 0, 0, 0);
Date anteriorDate = anteriorCalendar.getTime();
Date atualDate = atualCalendar.getTime();
DateTime anteriorDateTime = new DateTime(anteriorCalendar.get(Calendar.YEAR), anteriorCalendar.get(Calendar.MONTH), anteriorCalendar.get(Calendar.DAY_OF_MONTH), anteriorCalendar.get(Calendar.HOUR_OF_DAY), anteriorCalendar.get(Calendar.MINUTE), anteriorCalendar.get(Calendar.SECOND), anteriorCalendar.get(Calendar.MILLISECOND));
DateTime atualDateTime = new DateTime(atualCalendar.get(Calendar.YEAR), atualCalendar.get(Calendar.MONTH), atualCalendar.get(Calendar.DAY_OF_MONTH), atualCalendar.get(Calendar.HOUR_OF_DAY), atualCalendar.get(Calendar.MINUTE), atualCalendar.get(Calendar.SECOND), atualCalendar.get(Calendar.MILLISECOND));
System.out.println("Sobrecarga de Date Obter: " + DateUtil.obterDiferencaEntreAnos(atualDate, anteriorDate));
System.out.println("Sobrecarga de Date Validar: " + DateUtil.validarPeriodoEmAnos(atualDate, anteriorDate, 18));
System.out.println("\n");
System.out.println("Sobrecarga de Calendar Obter: " + DateUtil.obterDiferencaEntreAnos(atualCalendar, anteriorCalendar));
System.out.println("Sobrecarga de Calendar Validar: " + DateUtil.validarPeriodoEmAnos(atualCalendar, anteriorCalendar, 18));
System.out.println("\n");
System.out.println("Sobrecarga de DateTime Obter: " + DateUtil.obterDiferencaEntreAnos(atualDateTime, anteriorDateTime));
System.out.println("Sobrecarga de DateTime Validar: " + DateUtil.validarPeriodoEmAnos(atualDateTime, anteriorDateTime, 18));
}
}
espero ter ajudado.