Código de Java - Diferencia de días entre dos fechas

Versión 1.0
estrellaestrellaestrellaestrellaestrella(19)

Publicado el 20 de Septiembre del 2016gráfica de visualizaciones de la versión: Versión 1.0
123.108 visualizaciones desde el 20 de Septiembre del 2016
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class test {
 
	public static void main(String[] args) throws ParseException {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
 
		Date fechaInicial=dateFormat.parse("2016-02-14");
		Date fechaFinal=dateFormat.parse("2016-03-22");
 
		int dias=(int) ((fechaFinal.getTime()-fechaInicial.getTime())/86400000);
 
		System.out.println("Hay "+dias+" dias de diferencia");
	}
}



Comentarios sobre la versión: Versión 1.0 (19)

Imágen de perfil
21 de Septiembre del 2016
estrellaestrellaestrellaestrellaestrella
Excelente, Aporte
Responder
3 de Octubre del 2016
estrellaestrellaestrellaestrellaestrella
sencillo y claro
Responder
Samuel
8 de Marzo del 2017
estrellaestrellaestrellaestrellaestrella
NO EXISTE LA FECHA 31 DE ABRIL, POR LO QUE NO DEBERÍA DAR LA DIFERENCIA DE ESA FECHA RESPECTO A OTRA, EN DEFINITIVA QUE EL MÉTODO FUNCIONA MAL
Responder
Kevin Aguilar
18 de Octubre del 2017
estrellaestrellaestrellaestrellaestrella
Lo que pasa es que solo te muestra la diferencia entre tiempo (Milisegundos) transcurridos entre Dia X y dia Y, independientemente del dia del calendario que tengas... Si tienes una fecha normalizada desde antes no es necesario comprobar si existe o no la fecha.

Como nota: 1 Día = 86,400,000 Milisegundos

Saludos¡¡¡
Responder
Miguel
21 de Mayo del 2019
estrellaestrellaestrellaestrellaestrella
Hay que hacer una función de comprobación antes... por ejemplo...

public String validarFecha() {
boolean validar = false;
int dia;
int mes = 0;
int año;
int checkdia;
int checkmes;
int checks;

do {
checkdia = 0;
checkmes = 0;
checks = 0;
dia = Integer.parseInt((String) JOptionPane.showInputDialog(null, textocuerpodia, textocabecera, JOptionPane.QUESTION_MESSAGE, null, listadias, listadias[0]));
String mesletra = (String) JOptionPane.showInputDialog(null, textocuerpomes, textocabecera, JOptionPane.QUESTION_MESSAGE, null, listameses, listameses[0]);
año = Integer.parseInt((String) JOptionPane.showInputDialog(null, textocuerpoaño, textocabecera, JOptionPane.QUESTION_MESSAGE, null, listaaños, listaaños[0]));

if (mesletra.equals("Enero") || mesletra.equals("Marzo") || mesletra.equals("Mayo") || mesletra.equals("Julio") || mesletra.equals("Agosto") || mesletra.equals("Octubre") || mesletra.equals("Diciembre")) {
if (dia <= 31) {
checkdia++;
}
} else if (mesletra.equals("Abril") || mesletra.equals("Junio") || mesletra.equals("Septiembre") || mesletra.equals("Noviembre")) {
if (dia <= 30) {
checkdia++;
}
} else if (mesletra.equals("Febrero")) {
if (año % 4 == 0 && año % 100 != 0 || año % 400 == 0) {
if (dia <= 29) {
checkdia++;
}
} else {
if (dia <= 28) {
checkdia++;
}
}
}

for (int i=0; i<listameses.length; i++) {
if (listameses[i].equals(mesletra)) {
mes = i+1;
}
}

if (mes <= 12 && mes> 0) {
checkmes++;
}

checks = checkdia + checkmes;
if (checks == 2) {
JOptionPane.showMessageDialog(null, "La fecha es correcta", textocabecera, 1);
validar = true;
}
else
{
JOptionPane.showMessageDialog(null, "La fecha es incorrecta", textocabecera, 1);
validar = false;
}

} while (validar == false);

return (año + "-" + mes + "-" + dia);
}

hay que contar que hay arrays con listas, textos... etc.
Responder
JOSE
26 de Abril del 2017
estrellaestrellaestrellaestrellaestrella
La mejor explicación que encontré. Funciona bastante bien, ahora lo que ocupo es poder meter la fechas por teclado.

Saludos
Responder
Imágen de perfil
9 de Mayo del 2017
estrellaestrellaestrellaestrellaestrella
Aquí tienes una mejora, que permite introducir las fechas por consola así como control de errores sobre la fecha introducidas para que no se puedan dar los casos que comenta @Samuel

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.StringTokenizer;

public class CalDias {

public static void main(String[] args) throws ParseException {
//* Definimos la variable para almacenar la fecha menor
String D_FEC_INI = "";
//* Definimos la variable para almacenar la fecha mayor
String D_FEC_FIN = "";
//* Definimos la variable para almacenar la fecha a verificar
String VERIF_FECHA = "";
//* Limpiamos la pantalla. Ya que no existe comando, instertamos lineas en blanco a la consola
for (int i=0; i<200;i++)
System.out.println();
//* Se define el formato de las fechas
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//* Bienvenida al programa
System.out.println ("*------------------------------------------*");
System.out.println (" BIENVENIDO AL CALCULO DE DIAS ENTRE FECHAS ");
System.out.println ("*------------------------------------------*");
//* Solicitamos la fecha
System.out.println ("Introduzca Fecha Inicial (en formato YYYY-MM-DD) :");
//* Aceptamos la fecha introducida por pantalla
Scanner entradaEscaner = new Scanner (System.in);
//* Movemos la fecha a la variable definida
D_FEC_INI = entradaEscaner.nextLine ();
//* Verificamos el formato de la variable si se corresponde con YYYY-MM-DD
Date fechaInicial=dateFormat.parse(D_FEC_INI);
//* Llamamos al procedimiento de verificacion de fechas
verificar(D_FEC_INI);
//* Solicitamos la segunda fecha
System.out.println ("Introduzca Fecha Final (en formato YYYY-MM-DD) :");
//* Movemos la segunda fecha a la variable definida
D_FEC_FIN = entradaEscaner.nextLine ();
//* Verificamos el formato de la variable si se corresponde con YYYY-MM-DD
Date fechaFinal=dateFormat.parse(D_FEC_FIN);
//* Llamamos al procedimiento de verificacion de fechas
verificar(D_FEC_FIN);
//* Se calcula el numero de dias entre las dos fechas
int dias=(int) ((fechaFinal.getTime()-fechaInicial.getTime())/86400000);
//* Linea en blanco
System.out.println("");
//* Se muestra por pantalla el resultado de la operacion
System.out.println("Entre el "+D_FEC_INI+" y el "+D_FEC_FIN+" existen "+dias+" dias de diferencia");
}
private static void verificar(String VERIF_FECHA){
System.out.println("");
System.out.println("Verificamos la fecha enviada "+VERIF_FECHA);
String DATA[] = VERIF_FECHA.split("-");
String DIA = DATA[2];
String MES = DATA[1];
String ANY = DATA[0];
System.out.println("DIA: "+DIA);
System.out.println("MES :"+MES);
System.out.println("ANY :"+ANY);
System.out.println("");

switch(MES){
case "01":
case "03":
case "05":
case "07":
case "08":
case "10":
case "12":
if (Integer.valueOf(DIA) >= 1 && Integer.valueOf(DIA) <= 31)
break;
else
System.out.println("La fecha "+VERIF_FECHA+" es incorrecta. El mes "+MES+" no tiene dia "+DIA+". La operacion no sera correcta");
System.out.println("FINALIZAMOS EL PROGRAMA ANTES DE TIEMPO POR ERROR DE DATOS A LA ENTRADA");
System.exit(0);
break;
case "04":
case "06":
case "09":
case "11":
if (Integer.valueOf(DIA) >= 1 && Integer.valueOf(DIA) <= 30)
break;
else
System.out.println("La fecha "+VERIF_FECHA+" es incorrecta. El mes "+MES+" no tiene dia "+DIA+". La operacion no sera correcta");
System.out.println("FINALIZAMOS EL PROGRAMA ANTES DE TIEMPO POR ERROR DE DATOS A LA ENTRADA");
System.exit(0);
break;
case "02":
if (Integer.valueOf(DIA) >= 1 && Integer.valueOf(DIA) <= 29)
break;
else
System.out.println("La fecha "+VERIF_FECHA+" es incorrecta. El mes "+MES+" no tiene dia "+DIA+". La operacion no sera correcta");
System.out.println("FINALIZAMOS EL PROGRAMA ANTES DE TIEMPO POR ERROR DE DATOS A LA ENTRADA");
System.exit(0);
break;
default:
System.out.println("En mes "+MES+" no existe. Los calculos no seran correctos");
System.out.println("FINALIZAMOS EL PROGRAMA ANTES DE TIEMPO POR ERROR DE DATOS A LA ENTRADA");
System.exit(0);
}
}
}
Responder
marcelo
28 de Septiembre del 2017
estrellaestrellaestrellaestrellaestrella
Si usas java 1.7... lo mejor es usar lambda.. te ahorras todo esto.
Responder
tigreci
22 de Marzo del 2018
estrellaestrellaestrellaestrellaestrella
Siento deciros que el codigo es incorrecto no se tiene en cuenta fechas en dos horarios distintos es decir no se tiene en cuenta que una fecha sea horario de verano y otra horario de invierno esto para probarlo poned las fechas 25/03/2018 y 26/03/2018 os devolvera cero dias cuando deberia ser uno para corregir esto hay que usar UTC

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;
import java.util.TimeZone;


public class test {



public static void main(String[] args) throws ParseException {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//Hay que añadir esto y ya es correcto, sin esto falla para las fechas indicadas
//En el ejemplo porque entre el 25 y el 26 hay 23 horas y no 24
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

Date fechaInicial=dateFormat.parse("2018-03-25");

Date fechaFinal=dateFormat.parse("2018-03-26");



int dias=(int) ((fechaFinal.getTime()-fechaInicial.getTime())/86400000);



System.out.println("Hay "+dias+" dias de diferencia");

}

}
Responder
juan muñoz
14 de Mayo del 2018
estrellaestrellaestrellaestrellaestrella
Si funciona, si divides eso e 360 te da la edad de x persona editando segun la necesidad
Responder
Petrus
4 de Agosto del 2018
estrellaestrellaestrellaestrellaestrella
https://masqueprogramar.wordpress.com/2016/11/23/funcion-numero-de-dias-entre-dos-fechas-en-java/
Responder
Alexandra
9 de Abril del 2019
estrellaestrellaestrellaestrellaestrella
No ha dejado ningún comentario
Responder
Jesús Baldemar
4 de Julio del 2019
estrellaestrellaestrellaestrellaestrella
Perfecto, solo ocupaba la linea 13 ahí esta la magia lo demás pues ya es otra cosa. :D
Responder
Chuchin
25 de Julio del 2019
estrellaestrellaestrellaestrellaestrella
necesito programación que tema "fecha inicial y fecha final" por favor
Responder
carlos
7 de Agosto del 2019
estrellaestrellaestrellaestrellaestrella
Perfecto..., solo habría que advertir de la necesidad de utilizar bien las variables y redondear bien el resultado con el método Mat.round...., ya que si no se te pueden presentar pequeñas variaciones que si necesitan estar bien ajustadas te provoquen un resultado inesperado, un día menos por ejemplo
Responder
tufao
2 de Septiembre del 2019
estrellaestrellaestrellaestrellaestrella
Concreto y simple, como debería ser todo...Gracias
Responder
Yvette
24 de Noviembre del 2019
estrellaestrellaestrellaestrellaestrella
Hola, buenas.

Tengo una duda, y no se si alguien me puede ayudar.

Necesito un código de restar dos fechas, que no sea Date sino Fecha. Debe funcionar con classes Fecha ya creadas, y que sea static.¿Alguien tiene alguno o sabe como puede ayudarme?

Llevo ya 3 semanas con lo mismo, probando y refactorizando códigos, y ya no se que más puedo hacer. Por favor, si alguien tiene alguna idea, se lo agradezco. Gracias de antemano.

Dejo una breve explicación del proyecto por si puede ayudar:

Estoy creando en Eclipse con Java una app para un Hotel. En ella, se pide al usuario que escriba la fecha de entrada y de salida, mediante dos funciones class.

Para sacar el número de días que van a estar hospedados, he recalculado el atributo, pero para ello, necesito restar las dos fechas pedidas para que me diga exactamente cuántos días hay entre la fecha de inicio y la de fin. Y aquí es dónde falla todo, porque no tengo un restafechas adecuado, y tampoco se cómo hacerlo, porque aún soy novata...
Responder
diego
7 de Mayo del 2020
estrellaestrellaestrellaestrellaestrella
Hay un error al restar 2020-10-02 y 2020-11-02 me da como resultado 30 dias pero octubre tiene 31 dias, los otros meses sale bien, a alguien mas le paso?
Responder
Jairo Beltrán
6 de Agosto del 2023
estrellaestrellaestrellaestrellaestrella
demasiado complejo entender su código
Responder

Comentar la versión: Versión 1.0

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s3676