Java - Calcular diferencia entre dos fechas

 
Vista:

Calcular diferencia entre dos fechas

Publicado por Luis (83 intervenciones) el 28/12/2009 23:11:34
Lo que me pregunto es si se puede saber cuanto tiempo o cual es la diferencia en años, meses y dias entre una fecha y otra.

Por ejemplo tengo dos fechas:
1. 12/10/2001
2. 12/12/2009

Existe alguna forma en que yo pueda saber que la diferencia entre esas dos fechas es de 8 años y dos meses.

Yo lo he estado haciendo de la siguiente forma aunque todavia no completo todas validaciones que tendria que hacer para lograrlo de esta forma.

Date fechaDeHoy = new Date();
SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
String fecha = formato.format(fechaDeHoy);
String[] fechaHoy = fecha.split("/");
Integer diaHoy = Integer.parseInt(fechaHoy[0]);
Integer mesHoy = Integer.parseInt(fechaHoy[1]);
Integer anioHoy = Integer.parseInt(fechaHoy[2]);

String fechaAnterior = "12/10/2001"
String[] fechaAnt = fechaAnterior.split("/");
Integer diaAnt = Integer.parseInt(fechaAnt[0]);
Integer mesAnt = Integer.parseInt(fechaAnt[1]);
Integer anioAnt = Integer.parseInt(fechaAnt[2]);

if(anioAnt == anioHoy){
if(mesAnt == mesHoy){
if(diaAnt == diaHoy){
System.out.println("las fechas son iguales");
}else if(diaHoy > diaAnt){
System.out.println("La diferencia entre ambas fechas es de " + diaHoy - diaAnt + " dias");
}
}
}

Y asi con todas las demas posibilidades que no las he hecho aun.

Lo que me pregunto es si hay alguna forma de resolver este problema de forma mas sencilla que preguntando por todas las posibilidades.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Calcular diferencia entre dos fechas

Publicado por Luis (83 intervenciones) el 30/12/2009 04:19:01
Buenas

Ya aprendi como obtener la cantidad de años, meses y dias que de han transcurrido entre una fecha y otra.

Por ejemplo
FechaHoy = 29/12/2009
FechaAnterior = 12/10/2001

Ya puedo saber que han pasado 8 años o 98 meses o 3000 dias.

Todo esto lo consigo con el metodo getTime() que devuelve la cantidad de milisegundos

De esta forma puedo conocer los dias por ejemplo:
long fechaInicial = fechaInicial.getTime(); //Tanto fecha inicial como fecha final son Date.
long fechaFinal = fechaFinal.getTime();
long diferencia = fechaFinalMs - fechaInicialMs;
double dias = Math.floor(diferencia / (1000 * 60 * 60 * 24));

Y si resto por ejemplo 2009 - 2001 me da la cantidad de años.

Ahora el problema es que yo lo necesito saber de esta forma: entre las dos fechas que coloco anteriormente han transcurrido 8 años dos meses y 17 dias.

El problema que veo para poder obtener esto de esa forma es que tendria que saber cuantos años bisiestos hay entre esas dos fechas para tomar en cuenta que febrero tiene un dia mas en esos años.

He buscado como obtener esto de esta forma y no lo consigo. Si alguien sabe como resolver esto de verdad se lo agradecería.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por Bosco Garita (9 intervenciones) el 01/01/2010 03:08:45
Hola Luis. Que bueno que te esfuerzas. Así hay que ser.
Bueno lo que buscas es relativamente fácil. Se hace de esta manera:
Para saber si el año para determinada fecha es bisciesto ...

1. Ya tienes una variable de tipo Calendar con el valor de fecha ya establecido como
Calendar fecha = GregorianCalendar.getInstance();
2. Realizar la prueba.
if (fecha.get(Calendar.YEAR) % 4 == 0) // Año bisciesto
JOptionPane.showMessageDialog(null, "Este año es bisciesto");
else
JOptionPane.showMessageDialog(null, "Este año NO es bisciesto");
// end if

Espero que te sirva.
Feliz año nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por Luis (83 intervenciones) el 02/01/2010 00:43:35
Feliz año nuevo.

Bosco gracias por tu respuesta.

Les cuento que ya por fin pude solucionar este problema por lo menos hasta cierto punto y ya con eso creo que me basta para resolver el problema.

Consegui este metodo en internet que pasando dos fechas te devuelve la cantidad de años, meses o dias.

public int diferenciaFechas(String fec1, String fec2,int valor){
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
int retorno=0;
java.util.Date date1 = null;
java.util.Date date2 = null;
try
{
Calendar cal1 = null;
date1=df.parse(fec1);
cal1=Calendar.getInstance();

Calendar cal2 = null;
date2=df.parse(fec2);
cal2=Calendar.getInstance();

// different date might have different offset
cal1.setTime(date1);
long ldate1 = date1.getTime() + cal1.get(Calendar.ZONE_OFFSET) + cal1.get(Calendar.DST_OFFSET);

cal2.setTime(date2);
long ldate2 = date2.getTime() + cal2.get(Calendar.ZONE_OFFSET) + cal2.get(Calendar.DST_OFFSET);

// Use integer calculation, truncate the decimals
int hr1 = (int)(ldate1/3600000); //60*60*1000
int hr2 = (int)(ldate2/3600000);

int days1 = (int)hr1/24;
int days2 = (int)hr2/24;

int dateDiff = days2 - days1;
int yearDiff = cal2.get(Calendar.YEAR) - cal1.get(Calendar.YEAR);
int monthDiff = yearDiff * 12 + cal2.get(Calendar.MONTH) - cal1.get(Calendar.MONTH);

if(valor==1) {
if (dateDiff<0) dateDiff=dateDiff*(-1);
retorno=dateDiff;
}else if(valor==2){
if (monthDiff<0) monthDiff=monthDiff*(-1);
retorno=monthDiff;
}else if(valor==3){
if (yearDiff<0) yearDiff=yearDiff*(-1);
retorno=yearDiff;
}
}
catch (ParseException pe)
{
pe.printStackTrace();
}
return retorno;
}

Entonces se me ocurrio que si obtengo los años y los meses podia saber la diferencia entre esas fechas como yo la necesito.

int meses = diferenciaFechas(fechaI, fecha, 2);
int anios = diferenciaFechas(fechaI, fecha, 3);
int difMeses = anios * 12;

if(difMeses == meses){
System.out.println("tiene "+anios);
}else if(anios == 0){
System.out.println("tiene "+meses+" meses");
}else if (anios > 0){
System.out.println("tiene "+anios+" años y "+ (meses - difMeses) +" meses");
}

Entonces hice este codigo que con las fechas que lo probe funciona bien.
La logica que se me ocurrio fue que si yo multiplico la cantidad de años * 12 me da la cantidad de meses que hay entre dos años.

Por ejemplo

String fechaAnt= 12/10/2001;
String fechaHoy= 29/10/2009;
Las mismas fechas que puse antes.

Entonces cuando hago esto
int anios = diferenciaFechas(fechaI, fecha, 3);

Me dice que pasaron 8 años entre esas dos fechas

Y cuando hago esto
int meses = diferenciaFechas(fechaI, fecha, 2);
Me dice que pasaron 98 meses entre las dos fechas

Por lo tanto si yo multiplico 8 * 12 = 96
Y 98 - 96 me da 2

Por tanto la diferencia entre las dos fechas es de 8 años y dos meses.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por Luis (83 intervenciones) el 03/01/2010 02:46:52
Consegui otra forma de resolver esto que te dice tanto los años como los meses y los dias de la forma que yo lo necesito.

Al codigo que puse antes le faltan validaciones este esta mas completo. Estaba escrito en otro lenguaje de programacion y lo adapte a java. Espero que le sirva a mucha gente puesto que es muy dificil de encontrar.

public void diferencia(){

String fechaInicio = "28/12/1999";
String fechaActual = "29/02/2000";
String[] aFechaIng = fechaInicio.split("/");
Integer diaInicio = Integer.parseInt(aFechaIng[0]);
Integer mesInicio = Integer.parseInt(aFechaIng[1]);
Integer anioInicio = Integer.parseInt(aFechaIng[2]);

String[] aFecha = fechaActual.split("/");
Integer diaActual = Integer.parseInt(aFecha[0]);
Integer mesActual = Integer.parseInt(aFecha[1]);
Integer anioActual = Integer.parseInt(aFecha[2]);

System.out.println(diaActual);
System.out.println(mesActual);
System.out.println(anioActual);
int b = 0;
int dias = 0;
int mes = 0;
int anios = 0;
int meses = 0;
mes = mesInicio - 1;
if(mes==2){
if ((anioActual % 4 == 0) && ((anioActual % 100 != 0) || (anioActual % 400 == 0))){
b = 29;
}else{
b = 28;
}
}else if(mes <= 7){
if(mes == 0){
b = 31;
}else if(mes % 2==0){
b = 30;
}else{
b = 31;
}
}else if(mes > 7){
if(mes % 2 == 0){
b = 31;
}else{
b = 30;
}
}
if((anioInicio > anioActual) || (anioInicio == anioActual && mesInicio > mesActual) ||
(anioInicio == anioActual && mesInicio == mesActual && diaInicio > diaActual)){
System.out.println("La fecha de inicio ha de ser anterior a la fecha Actual");
}else{
if(mesInicio <= mesActual){
anios = anioActual - anioInicio;
if (diaInicio <= diaActual){
meses = mesActual - mesInicio;
dias = b - (diaInicio - diaActual);
}else{
if(mesActual == mesInicio){
anios = anios - 1;
}
meses = (mesActual - mesInicio - 1 + 12) % 12;
dias = b - (diaInicio - diaActual);
}
}else{
anios = anioActual - anioInicio - 1;
System.out.println(anios);
if(diaInicio > diaActual){
meses = mesActual - mesInicio - 1 + 12;
dias = b - (diaInicio - diaActual);
}else{
meses = mesActual - mesInicio + 12;
dias = diaActual -diaInicio;
}
}
}

System.out.println("Años: "+anios);
System.out.println("Meses: "+meses);
System.out.println("Días: "+dias);

}

En este caso han transcurrido dos meses y un dia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por Anonimo (1 intervención) el 23/07/2012 12:05:10
Por si a alguien le sirve:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
 * Calcula la diferencia entre dos fechas. Devuelve el resultado en días, meses o años según sea el valor del parámetro 'tipo'
 * @param fechaInicio Fecha inicial
 * @param fechaFin Fecha final
 * @param tipo 0=TotalAños; 1=TotalMeses; 2=TotalDías; 3=MesesDelAnio; 4=DiasDelMes
 * @return numero de días, meses o años de diferencia
 */
public long getDiffDates(Date fechaInicio, Date fechaFin, int tipo) {
	// Fecha inicio
	Calendar calendarInicio = Calendar.getInstance();
	calendarInicio.setTime(fechaInicio);
	int diaInicio = calendarInicio.get(Calendar.DAY_OF_MONTH);
	int mesInicio = calendarInicio.get(Calendar.MONTH) + 1; // 0 Enero, 11 Diciembre
	int anioInicio = calendarInicio.get(Calendar.YEAR);
 
	// Fecha fin
	Calendar calendarFin = Calendar.getInstance();
	calendarFin.setTime(fechaFin);
	int diaFin = calendarFin.get(Calendar.DAY_OF_MONTH);
	int mesFin = calendarFin.get(Calendar.MONTH) + 1; // 0 Enero, 11 Diciembre
	int anioFin = calendarFin.get(Calendar.YEAR);
 
	int anios = 0;
	int mesesPorAnio = 0;
	int diasPorMes = 0;
	int diasTipoMes = 0;
 
	//
	// Calculo de días del mes
	//
	if (mesInicio == 2) {
		// Febrero
		if ((anioFin % 4 == 0) && ((anioFin % 100 != 0) || (anioFin % 400 == 0))) {
			// Bisiesto
			diasTipoMes = 29;
		} else {
			// No bisiesto
			diasTipoMes = 28;
		}
	} else if (mesInicio <= 7) {
		// De Enero a Julio los meses pares tienen 30 y los impares 31
		if (mesInicio % 2 == 0) {
			diasTipoMes = 30;
		} else {
			diasTipoMes = 31;
		}
	} else if (mesInicio > 7) {
		// De Julio a Diciembre los meses pares tienen 31 y los impares 30
		if (mesInicio % 2 == 0) {
			diasTipoMes = 31;
		} else {
			diasTipoMes = 30;
		}
	}
 
 
	//
	// Calculo de diferencia de año, mes y dia
	//
	if ((anioInicio > anioFin) || (anioInicio == anioFin && mesInicio > mesFin)
			|| (anioInicio == anioFin && mesInicio == mesFin && diaInicio > diaFin)) {
		// La fecha de inicio es posterior a la fecha fin
		// System.out.println("La fecha de inicio ha de ser anterior a la fecha fin");
		return -1;
	} else {
		if (mesInicio <= mesFin) {
			anios = anioFin - anioInicio;
			if (diaInicio <= diaFin) {
				mesesPorAnio = mesFin - mesInicio;
				diasPorMes = diaFin - diaInicio;
			} else {
				if (mesFin == mesInicio) {
					anios = anios - 1;
				}
				mesesPorAnio = (mesFin - mesInicio - 1 + 12) % 12;
				diasPorMes = diasTipoMes - (diaInicio - diaFin);
			}
		} else {
			anios = anioFin - anioInicio - 1;
			System.out.println(anios);
			if (diaInicio > diaFin) {
				mesesPorAnio = mesFin - mesInicio - 1 + 12;
				diasPorMes = diasTipoMes - (diaInicio - diaFin);
			} else {
				mesesPorAnio = mesFin - mesInicio + 12;
				diasPorMes = diaFin - diaInicio;
			}
		}
	}
	//System.out.println("Han transcurrido " + anios + " Años, " + mesesPorAnio + " Meses y " + diasPorMes + " Días.");		
 
	//
	// Totales
	//
	long returnValue = -1;
 
	switch (tipo) {
		case 0:
			// Total Años
			returnValue = anios;
			// System.out.println("Total años: " + returnValue + " Años.");
			break;
 
		case 1:
			// Total Meses
			returnValue = anios * 12 + mesesPorAnio;
			// System.out.println("Total meses: " + returnValue + " Meses.");
			break;
 
		case 2:
			// Total Dias (se calcula a partir de los milisegundos por día)
			long millsecsPerDay = 86400000; // Milisegundos al día
			returnValue = (fechaFin.getTime() - fechaInicio.getTime()) / millsecsPerDay;
			// System.out.println("Total días: " + returnValue + " Días.");
			break;
 
		case 3:
			// Meses del año
			returnValue = mesesPorAnio;
			// System.out.println("Meses del año: " + returnValue);
			break;
 
		case 4:
			// Dias del mes
			returnValue = diasPorMes;
			// System.out.println("Dias del mes: " + returnValue);
			break;
 
		default:
			break;
	}
 
	return returnValue;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por Juanja (1 intervención) el 24/11/2014 23:10:01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private void calcularDiasIT() {
        try {
            if (notaAuditoria.getFecInicioIt() == null || notaAuditoria.getFecFinalIt() == null) {
                Messagebox.show("Debe digitar un rango de fechas", Internationalization.inter("msgConfirmacionTitulo"), Messagebox.OK, Messagebox.INFORMATION);
                throw new Exception("Debe digitar un rango de fechas");
            }
            Calendar fecIni = Calendar.getInstance();
            fecIni.setTime(notaAuditoria.getFecInicioIt());
            Calendar fecFin = Calendar.getInstance();
            fecFin.setTime(notaAuditoria.getFecFinalIt());
            if (fecFin.before(fecIni)) {
                Messagebox.show("La fecha final debe ser mayor a la incial", Internationalization.inter("msgConfirmacionTitulo"), Messagebox.OK, Messagebox.INFORMATION);
                throw new Exception("La fecha final debe ser mayor a la incial");
            }
            int ini = fecIni.get(Calendar.DAY_OF_YEAR);
            int fin = fecFin.get(Calendar.DAY_OF_YEAR);
            Integer totalDias = fin - ini;
            if (totalDias == 0) {
                notaAuditoria.setValDiasIncapacidad(Short.valueOf("1"));
            } else {
                totalDias = totalDias + 1;
                notaAuditoria.setValDiasIncapacidad(totalDias.shortValue());
            }
        } catch (Exception e) {
            LogHandler.doLog(ConstantesLog.NIVEL_ERROR, e.toString(), this.getClass());
            Executions.sendRedirect(ConstantesUtil.URL_REFRESCAR);
        }
    }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por Elmero (1 intervención) el 01/07/2015 23:33:25
Muy bueno lo implemente en android estudio muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por Jessrom (2 intervenciones) el 03/08/2015 22:11:12
Los métodos y condiciones del usuario Anónimo es la correcta. Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por suso (1 intervención) el 01/03/2019 09:29:09
Un aportación genial, muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por MAURICIO TENE (2 intervenciones) el 18/08/2015 20:04:44
Que tal amigo, muy buen aporte.
Solo tengo una observacion. Cuando introduces una fecha que tenga el mismo dia y mes, pero años diferentes hay un error. por ejemplo si colocas 27/09/1989 Y 27/09/2015 la respuesta es 26 años 0 meses 31 dias.
Solo debes hacer una validacion extra de que cuando los dias sean mayor o igual a 31 se reste 31.
Espero que sirva en algo.
Muy buen aporte nuevamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por Jessrom (2 intervenciones) el 18/08/2015 21:05:58
Las intervenciones de Luis, tienen ese incidente. Pero, la que hace el Anónimo no. Inicialmente, probé la primera opción y justo me aparecía de la forma que tú mencionas, pero al hacerlo de la segunda forma, funciona correctamente.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular diferencia entre dos fechas

Publicado por MAURICIO TENE (2 intervenciones) el 18/08/2015 23:04:45
Estoy de acuerdo, la intervemcion de Luis se soluciona unicamente agregando esa condicion y corre perfectamete, claro que la otra está muy bien. AMBAS SON BUENAS SOLUCIONES.
SALUDOS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar