DateUtil com JodaTime, espero que ajude!

0 respostas
RafaelCassau

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.

Criado 10 de outubro de 2012
Respostas 0
Participantes 1