Subtração de data?

12 respostas
ThiagoWorldCoder

Boa tarde!!

Gostaria de saber como fazer subtração de data no java, tentei achar alguma função no Calendar, mas não tive sucesso!

grato!

12 Respostas

victor.godinho
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime()); // data de hoje


calendar.add(Calendar.DAY_OF_WEEK, -1); // tirando 1 dia
System.out.println(calendar.getTime()); // data de ontem
peerless

Você também pode dar uma olhadinha no framework “[google]JODA-TIME[/google]” mas ou usa um ou usa outro, se misturar vira porcaria. Joda time tbm é um bom exemplo para estudar sobre [google]fluent interfaces[/google]. Bem interessante ! :slight_smile:

V

Como assim subtração de datas?
Ter uma data inicial, uma final e retorna a diferença (em dias) entre elas?

peerless

vtr.oliveira:
Como assim subtração de datas?
Ter uma data inicial, uma final e retorna a diferença (em dias) entre elas?

Isso seria obter o periodo entre duas datas.

Subtração de datas é ter uma data menos outra data. A diferença pode ser em diminuir um ano, mes, dia, uma hora, um minuto, etc.

Alkamavo

pega as duas datas…

dia ano e mês e transforma em dias… e subtrai…vai te retornar o numero de dias entre elas…

V

Talvez isso te ajude a ter uma luz…

public static Date getDiferencaData(Date dtInicial, Date dtFinal) {
        //Convertendo as datas para milisegundos
        long milisecondBegin = dtInicial.getTime();
        long milisecondEnd = dtFinal.getTime();

        //Subtraindo os milisegundos, para obter a diferença
        long milisecondResult = milisecondBegin - milisecondEnd;
        
        return new Date(milisecondResult);
    }
ThiagoWorldCoder

Pessoal, muito obrigado pelas respostas. Realmente eu poderia transformar a hora em minutos e os segundos em minutos e calcular, mas eu queria ver primeiro se não tem nenhum método que faria isso retornando a subtração!

O que o victor falou pode funcionar, vou testar e falo se deu certo:

view plaincopy to clipboardprint?
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime()); // data de hoje

calendar.add(Calendar.DAY_OF_WEEK, -1); // tirando 1 dia
System.out.println(calendar.getTime()); // data de ontem

valeu!

ThiagoWorldCoder

O melhor jeito mesmo, é passar o tempo para uma base só, como o segundos e depois subtrair, eu estava querendo fazer a subtração para fazer a relação do tamanho de um pacote e o tempo que ele levava para percorrer um caminho.

valeu pela ajuda galera!

F

Olá ThiagoWorldCoder ,

Cara, vou quebrar seu galho, ralei muito uma época para fazer este calculo, foram vários dias de pesquisa, até que fui pegando a lógica de como funciona e montei um método, segue abaixo o método …

primeiro tem que importar uns pacotes,

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.GregorianCalendar;

import java.util.Date;
public static int calcula2(String dia1, String dia2){

         DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
         Date data3= null;
         Date data4 = null;
         long m1 = 0;
         long m2 = 0;
         try{
               data3 = (Date) fmt.parse(dia1);
               data4 = (Date) fmt.parse(dia2);
              }
         catch(Exception e){}
         Calendar data1 = new GregorianCalendar();
         data1.setTime(data3);
         Calendar data2 = new GregorianCalendar();
         data2.setTime(data4);
         m1 = data1.getTimeInMillis();
         m2 = data2.getTimeInMillis();
         return (int) ((m2 - m1) / (24*60*60*1000));
          }

Espero ter ajudado, observe os parametros do método …

Generosamente,

Frid

rafael.espiritosanto

Olá!

Aproveitando a discussão, gostaria de saber se já existe um método implementado que retorne o número de meses entre
duas datas.

Abraço!

rafael.espiritosanto

Olá mais uma vez!!!

Por não encontrar um método próprio da API fiz a implementação na mão

GregorianCalendar dataInicio = proposta.getDataInicioProjeto();
GregorianCalendar dataTermino = proposta.getDataFimProjeto();
		
long inicio = dataInicio.getTimeInMillis();
long fim = dataTermino.getTimeInMillis();
long intervalo = fim - inicio;
int duracaoProjeto = (int)(intervalo / (1000 * 60 * 60 * 24 * 30)); // resultado em meses

Colocando as datas de inicio como 30/10/2008 e fim como 30/11/2008 obtive a resposta -1.
Alguém pode dizer qual foi o erro cometido?

Abraço!

victor.godinho

Kara, fiz uma gambis aqui, mas tá funcionando tranquilão...

public class Main {

	public static void main(String[] args) {
		new Main();
	}
	
	Main() {
		Calendar dataInicial = Calendar.getInstance();
		Calendar dataFinal   = Calendar.getInstance();
		
		dataFinal.add(Calendar.YEAR, 2);
		dataFinal.add(Calendar.MONTH, 3);
		
		
		int quantidadeDeMeses = 0;
		
		if (dataInicial.get(Calendar.YEAR) < dataFinal.get(Calendar.YEAR)) {
			quantidadeDeMeses = 12 * (dataFinal.get(Calendar.YEAR) - dataInicial.get(Calendar.YEAR));
			
			if (dataInicial.get(Calendar.MONTH) > dataFinal.get(Calendar.MONTH)) {
				quantidadeDeMeses += (dataInicial.get(Calendar.MONTH) - dataFinal.get(Calendar.MONTH));
			}
			
		}
		
		if (dataInicial.get(Calendar.MONTH) < dataFinal.get(Calendar.MONTH)) {
			quantidadeDeMeses += (dataFinal.get(Calendar.MONTH) - dataInicial.get(Calendar.MONTH));
		}
		
		System.out.println(quantidadeDeMeses);
		
	}

}

huahuahuahu

Se servir.... rsrsrs

Falows

Criado 12 de setembro de 2008
Ultima resposta 25 de set. de 2008
Respostas 12
Participantes 7