Saltar al contenido

Android / Java: diferencia de fechas en días

Solución:

No es realmente un método confiable, es mejor usar JodaTime

  Calendar thatDay = Calendar.getInstance();
  thatDay.set(Calendar.DAY_OF_MONTH,25);
  thatDay.set(Calendar.MONTH,7); // 0-11 so 1 less
  thatDay.set(Calendar.YEAR, 1985);

  Calendar today = Calendar.getInstance();

  long diff = today.getTimeInMillis() - thatDay.getTimeInMillis(); //result in millis

Aquí hay una aproximación …

long days = diff / (24 * 60 * 60 * 1000);

Para analizar la fecha de una cadena, puede usar

  String strThatDay = "1985/08/25";
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
  Date d = null;
  try {
   d = formatter.parse(strThatDay);//catch exception
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 


  Calendar thatDay = Calendar.getInstance();
  thatDay.setTime(d); //rest is the same....

Aunque, ya que está seguro del formato de fecha … También podría hacer Integer.parseInt() en sus subcadenas para obtener sus valores numéricos.

Este NO es mi trabajo, encontré la respuesta aquí. no quería un enlace roto en el futuro :).

La clave es esta línea para tener en cuenta la configuración de la luz del día, ref. Código completo.

TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));

o intenta pasar TimeZone como parámetro para daysBetween() y llama setTimeZone() en el sDate y eDate objetos.

Así que aquí va:

public static Calendar getDatePart(Date date){
    Calendar cal = Calendar.getInstance();       // get calendar instance
    cal.setTime(date);      
    cal.set(Calendar.HOUR_OF_DAY, 0);            // set hour to midnight
    cal.set(Calendar.MINUTE, 0);                 // set minute in hour
    cal.set(Calendar.SECOND, 0);                 // set second in minute
    cal.set(Calendar.MILLISECOND, 0);            // set millisecond in second
    
    return cal;                                  // return the date part
}

getDatePart () tomado de aquí

/**
 * This method also assumes endDate >= startDate
**/
public static long daysBetween(Date startDate, Date endDate) {
  Calendar sDate = getDatePart(startDate);
  Calendar eDate = getDatePart(endDate);

  long daysBetween = 0;
  while (sDate.before(eDate)) {
      sDate.add(Calendar.DAY_OF_MONTH, 1);
      daysBetween++;
  }
  return daysBetween;
}

Los matices:
Encontrar la diferencia entre dos fechas no es tan sencillo como restar las dos fechas y dividir el resultado entre (24 * 60 * 60 * 1000). De hecho, ¡es erróneo!

Por ejemplo: La diferencia entre las dos fechas 24/03/2007 y 25/03/2007 debe ser de 1 día; Sin embargo, utilizando el método anterior, en el Reino Unido, ¡obtendrá 0 días!

Compruébelo usted mismo (código a continuación). Seguir el camino de los milisegundos conducirá a redondear los errores y se volverán más evidentes una vez que tenga algo como el horario de verano.

Código completo:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class DateTest {

public class DateTest {

static SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");

public static void main(String[] args) {

  TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));

  //diff between these 2 dates should be 1
  Date d1 = new Date("01/01/2007 12:00:00");
  Date d2 = new Date("01/02/2007 12:00:00");

  //diff between these 2 dates should be 1
  Date d3 = new Date("03/24/2007 12:00:00");
  Date d4 = new Date("03/25/2007 12:00:00");

  Calendar cal1 = Calendar.getInstance();cal1.setTime(d1);
  Calendar cal2 = Calendar.getInstance();cal2.setTime(d2);
  Calendar cal3 = Calendar.getInstance();cal3.setTime(d3);
  Calendar cal4 = Calendar.getInstance();cal4.setTime(d4);

  printOutput("Manual   ", d1, d2, calculateDays(d1, d2));
  printOutput("Calendar ", d1, d2, daysBetween(cal1, cal2));
  System.out.println("---");
  printOutput("Manual   ", d3, d4, calculateDays(d3, d4));
  printOutput("Calendar ", d3, d4, daysBetween(cal3, cal4));
}


private static void printOutput(String type, Date d1, Date d2, long result) {
  System.out.println(type+ "- Days between: " + sdf.format(d1)
                    + " and " + sdf.format(d2) + " is: " + result);
}

/** Manual Method - YIELDS INCORRECT RESULTS - DO NOT USE**/
/* This method is used to find the no of days between the given dates */
public static long calculateDays(Date dateEarly, Date dateLater) {
  return (dateLater.getTime() - dateEarly.getTime()) / (24 * 60 * 60 * 1000);
}

/** Using Calendar - THE CORRECT WAY**/
public static long daysBetween(Date startDate, Date endDate) {
  ...
}

PRODUCCIÓN:

Manual – Días entre: 01-ene-2007 y 02-ene-2007 es: 1

Calendario – Días entre: 01-ene-2007 y 02-ene-2007 es: 1


Manual – Días entre: 24-Mar-2007 y 25-Mar-2007 es: 0

Calendario – Días entre: 24-Mar-2007 y 25-Mar-2007 es: 1

La mayoría de las respuestas fueron buenas y adecuadas para su problema de

así que quiero encontrar la diferencia entre la fecha y el número de días, ¿cómo puedo encontrar la diferencia en días?

Sugiero este enfoque muy simple y directo que está garantizado para darle la diferencia correcta en cualquier zona horaria:

int difference= 
((int)((startDate.getTime()/(24*60*60*1000))
-(int)(endDate.getTime()/(24*60*60*1000))));

¡Y eso es!

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *