¿Cómo obtengo la diferencia entre dos fechas en Android? Probé todo y publiqué

Vi toda la publicación aquí y todavía no puedo entender cómo obtener la diferencia entre dos fechas de Android.

Esto es lo que hago:

long diff = date1.getTime() - date2.getTime();
Date diffDate = new Date(diff);

y obtengo: la fecha es el 1 de enero de 1970 y el tiempo siempre es mayor en dos horas... Soy de Israel, por lo que las dos horas son timeOffset.

¿Cómo puedo obtener la diferencia normal???

preguntado el 21 de mayo de 12 a las 19:05

Este código usa viejas clases de fecha y hora problemáticas ahora suplantadas por las clases java.time. Para Java y Android más antiguos, consulte la ThreeTen-Backport y TresDiezABP proyectos. -

12 Respuestas

Está cerca de la respuesta correcta, obtiene la diferencia en milisegundos entre esas dos fechas, pero cuando intenta construir una fecha a partir de esa diferencia, supone que desea crear una nueva Date objeto con ese valor de diferencia como su tiempo de época. Si está buscando un tiempo en horas, entonces simplemente necesitaría hacer un poco de aritmética básica sobre eso. diff para obtener las diferentes partes del tiempo.

Java:

long diff = date1.getTime() - date2.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;

Kotlin:

val diff: Long = date1.getTime() - date2.getTime()
val seconds = diff / 1000
val minutes = seconds / 60
val hours = minutes / 60
val days = hours / 24

Toda esta matemática simplemente hará aritmética de enteros, por lo que truncará cualquier punto decimal

Respondido 08 Jul 20, 12:07

¿Puedo crear un objeto Fecha a partir de esta información? - Alex Kapustian

Es una hora, no una fecha, ¿qué tipo de fecha estás intentando crear? - Dan F.

    long diffInMillisec = date1.getTime() - date2.getTime();

    long diffInDays = TimeUnit.MILLISECONDS.toDays(diffInMillisec);
    long diffInHours = TimeUnit.MILLISECONDS.toHours(diffInMillisec);
    long diffInMin = TimeUnit.MILLISECONDS.toMinutes(diffInMillisec);
    long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMillisec);

Respondido 09 Feb 16, 13:02

Requiere API Nivel 31. - Johann

Alguna adición: Aquí convierto la cadena a la fecha y luego comparo la hora actual.

String toyBornTime = "2014-06-18 12:56:50";
    SimpleDateFormat dateFormat = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");

    try {

        Date oldDate = dateFormat.parse(toyBornTime);
        System.out.println(oldDate);

        Date currentDate = new Date();

        long diff = currentDate.getTime() - oldDate.getTime();
        long seconds = diff / 1000;
        long minutes = seconds / 60;
        long hours = minutes / 60;
        long days = hours / 24;

        if (oldDate.before(currentDate)) {

            Log.e("oldDate", "is previous date");
            Log.e("Difference: ", " seconds: " + seconds + " minutes: " + minutes
                    + " hours: " + hours + " days: " + days);

        }

        // Log.e("toyBornTime", "" + toyBornTime);

    } catch (ParseException e) {

        e.printStackTrace();
    }

Respondido el 18 de junio de 14 a las 08:06

De su método, estoy restando dos fechas, la fecha actual y la fecha anterior de 10 días, está devolviendo milisegundos negativos. si se usan tanto la diferencia de fecha del día actual como la hora, se obtienen milisegundos positivos. ¿Por qué? - Satendra Baghel

Cambie diff a: long diff = currentDate.getTime() - oldDate.getTime(); Ayudará. - deepak rajput

java.tiempo.Duración

Utiliza java.time.Duration:

    Duration diff = Duration.between(instant2, instant1);
    System.out.println(diff);

Esto imprimirá algo como

PT109H27M21S

Esto significa un período de tiempo de 109 horas 27 minutos 21 segundos. Si desea algo más legible por humanos, le daré la versión de Java 9 primero, es más simple:

    String formattedDiff = String.format(Locale.ENGLISH,
            "%d days %d hours %d minutes %d seconds",
            diff.toDays(), diff.toHoursPart(), diff.toMinutesPart(), diff.toSecondsPart());
    System.out.println(formattedDiff);

Ahora tenemos

4 days 13 hours 27 minutes 21 seconds

La Duration la clase es parte de java.time la moderna API de fecha y hora de Java. Esto se incluye en los dispositivos Android más nuevos. En dispositivos más antiguos, obtenga ThreeTenABP y agréguelo a su proyecto, y asegúrese de importar org.threeten.bp.Duration y otras clases de fecha y hora que pueda necesitar del mismo paquete.

Suponiendo que aún no tenga la versión de Java 9, puede restar las unidades más grandes para obtener las más pequeñas:

    long days = diff.toDays();
    diff = diff.minusDays(days);
    long hours = diff.toHours();
    diff = diff.minusHours(hours);
    long minutes = diff.toMinutes();
    diff = diff.minusMinutes(minutes);
    long seconds = diff.toSeconds();

Luego puede formatear las cuatro variables como se indicó anteriormente.

¿Qué hiciste mal?

A Date representa un punto en el tiempo. Nunca fue pensado para representar una cantidad de tiempo, una duración, y no es adecuado para eso. Tratar de hacer que eso funcione sería el mejor de los conducir a un código confuso y difícil de mantener. No quieres eso, así que por favor no lo hagas.

Pregunta: ¿Java.time no requiere el nivel 26 de API de Android?

java.time funciona bien tanto en dispositivos Android antiguos como nuevos. Solo requiere al menos Java 6.

  • En Java 8 y versiones posteriores y en los dispositivos Android más nuevos (desde el nivel de API 26), la API moderna viene incorporada.
  • En Java 6 y 7 que no son de Android, obtenga ThreeTen Backport, el backport de las clases modernas (ThreeTen para JSR 310; consulte los enlaces en la parte inferior).
  • En Android (más antiguo), use la edición de Android de ThreeTen Backport. Se llama ThreeTenABP. Y asegúrese de importar las clases de fecha y hora de org.threeten.bp con subpaquetes.

Enlaces

respondido 17 nov., 19:06

Creo que esta es la respuesta más adecuada. Debe ser aceptado. - Vyacheslav

¿Qué pasa con el uso Acceso:

val instant1 = now()
val instant2 = now()
val diff: Duration = Duration.between(instant1, instant2)
val minutes = diff.toMinutes()

Incluso puedes guardar tu Instant usando instant1.toString() y analizar esa cadena con parse(string).

Si necesita admitir el nivel de API de Android <26, simplemente agregue Compatibilidad con la eliminación de azúcar de la API de Java 8+ a tu proyecto.

Respondido 12 Abr '21, 13:04

Aquí está mi respuesta basada en la respuesta de @Ole VV.

Esto también funciona con Singular.

private String getDuration(Date d1, Date d2) {
    Duration diff = Duration.between(d1.toInstant(), d2.toInstant());


    long days = diff.toDays();
    diff = diff.minusDays(days);
    long hours = diff.toHours();
    diff = diff.minusHours(hours);
    long minutes = diff.toMinutes();
    diff = diff.minusMinutes(minutes);
    long seconds = diff.toMillis();

    StringBuilder formattedDiff = new StringBuilder();
    if(days!=0){
        if(days==1){
            formattedDiff.append(days + " Day ");

        }else {
            formattedDiff.append(days + " Days ");
        }
    }if(hours!=0){
        if(hours==1){
            formattedDiff.append(hours + " hour ");
        }else{
            formattedDiff.append(hours + " hours ");
        }
    }if(minutes!=0){
        if(minutes==1){
            formattedDiff.append(minutes + " minute ");
        }else{
            formattedDiff.append(minutes + " minutes ");
        }
    }if(seconds!=0){
        if(seconds==1){
            formattedDiff.append(seconds + " second ");
        }else{
            formattedDiff.append(seconds + " seconds ");
        }
    }


    return formattedDiff.toString();
}

Funciona con un StringBuilder para agregar todo junto.

Respondido 18 Jul 19, 10:07

Si usa el lenguaje Kotlin para el desarrollo de Android, puede usar ExperimentalTime extensión. Para obtener la diferencia en días, puede usarlo así:

@ExperimentalTime
fun daysDiff(c1: Calendar, c2: Calendar): Double {
    val diffInMillis = c1.timeInMillis - c2.timeInMillis
    return diffInMillis.milliseconds.inDays
}

o si desea obtener resultados como un número entero:

@ExperimentalTime
fun daysDiff2(c1: Calendar, c2: Calendar): Int {
    val diffInMillis = c1.timeInMillis - c2.timeInMillis
    return diffInMillis.milliseconds.toInt(DurationUnit.DAYS)
}

contestado el 11 de mayo de 20 a las 14:05

Probé este método... pero no sé por qué no obtengo el resultado adecuado.

long diff = date1.getTime() - date2.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;

Pero esto funciona

long miliSeconds = date1.getTime() -date2.getTime();
long seconds = TimeUnit.MILLISECONDS.toSeconds(miliSeconds);
long minute = seconds/60;
long hour = minute/60;
long days = hour/24;

Respondido 01 ago 20, 17:08

Usando calandria georgiana

 public void dateDifferenceExample() {

        // Set the date for both of the calendar instance
        GregorianCalendar calDate = new GregorianCalendar(2012, 10, 02,5,23,43);
        GregorianCalendar cal2 = new GregorianCalendar(2015, 04, 02);

        // Get the represented date in milliseconds
        long millis1 = calDate.getTimeInMillis();
        long millis2 = cal2.getTimeInMillis();

        // Calculate difference in milliseconds
        long diff = millis2 - millis1;

        // Calculate difference in seconds
        long diffSeconds = diff / 1000;

        // Calculate difference in minutes
        long diffMinutes = diff / (60 * 1000);

        // Calculate difference in hours
        long diffHours = diff / (60 * 60 * 1000);

        // Calculate difference in days
        long diffDays = diff / (24 * 60 * 60 * 1000);
    Toast.makeText(getContext(), ""+diffSeconds, Toast.LENGTH_SHORT).show();


}

Respondido el 07 de enero de 19 a las 07:01

GregorianCalendar es una clase terrible que fue suplantada hace años por la java.tiempo clases, específicamente ZonedDateTime. Sugerir que la vieja clase en 2019 es un mal consejo. Para versiones anteriores de Android, consulte el ThreeTen-Backport y TresDiezABP proyectos. - Albahaca bourque

Utilice estas funciones

    public static int getDateDifference(
        int previousYear, int previousMonthOfYear, int previousDayOfMonth,
        int nextYear, int nextMonthOfYear, int nextDayOfMonth,
        int differenceToCount){
    // int differenceToCount = can be any of the following
    //  Calendar.MILLISECOND;
    //  Calendar.SECOND;
    //  Calendar.MINUTE;
    //  Calendar.HOUR;
    //  Calendar.DAY_OF_MONTH;
    //  Calendar.MONTH;
    //  Calendar.YEAR;
    //  Calendar.----

    Calendar previousDate = Calendar.getInstance();
    previousDate.set(Calendar.DAY_OF_MONTH, previousDayOfMonth);
    // month is zero indexed so month should be minus 1
    previousDate.set(Calendar.MONTH, previousMonthOfYear);
    previousDate.set(Calendar.YEAR, previousYear);

    Calendar nextDate = Calendar.getInstance();
    nextDate.set(Calendar.DAY_OF_MONTH, previousDayOfMonth);
    // month is zero indexed so month should be minus 1
    nextDate.set(Calendar.MONTH, previousMonthOfYear);
    nextDate.set(Calendar.YEAR, previousYear);

    return getDateDifference(previousDate,nextDate,differenceToCount);
}
public static int getDateDifference(Calendar previousDate,Calendar nextDate,int differenceToCount){
    // int differenceToCount = can be any of the following
    //  Calendar.MILLISECOND;
    //  Calendar.SECOND;
    //  Calendar.MINUTE;
    //  Calendar.HOUR;
    //  Calendar.DAY_OF_MONTH;
    //  Calendar.MONTH;
    //  Calendar.YEAR;
    //  Calendar.----

    //raise an exception if previous is greater than nextdate.
    if(previousDate.compareTo(nextDate)>0){
        throw new RuntimeException("Previous Date is later than Nextdate");
    }

    int difference=0;
    while(previousDate.compareTo(nextDate)<=0){
        difference++;
        previousDate.add(differenceToCount,1);
    }
    return difference;
}

respondido 29 nov., 17:06

Este código usa viejas clases de fecha y hora problemáticas ahora suplantadas por las clases java.time. Para Java y Android más antiguos, consulte la ThreeTen-Backport y TresDiezABP proyectos. - Albahaca bourque

¿Es la clase de calendario una antigua clase de fecha y hora? - neal zedlav

Sí, cualquier clase relacionada con la fecha y la hora que se encuentre fuera del java.time El paquete es ahora heredado y debe evitarse. Esto incluye Date y Calendary las clases java.sql. Consulte el tutorial de Oracle. - Albahaca bourque

escrito en Kotlin: si necesita una diferencia entre 2 fechas y no le importan las fechas en sí (bien si necesita hacer algo en la aplicación, según el tiempo de otra operación que se guardó en las preferencias compartidas, por ejemplo). guardar la primera vez:

val firstTime:Long= System.currentTimeMillis()

guardar la segunda vez:

val now:Long= System.currentTimeMillis()

calcular los milisegundos entre 2 veces:

val milisecondsSinceLastTime: Long =(now-lastScrollTime)

Respondido 02 Feb 20, 01:02

respuesta más corta que funciona para mí. Enviar fecha de inicio y finalización en milisegundos.

public int GetDifference(long start,long end){
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(start);
    int hour = cal.get(Calendar.HOUR_OF_DAY);
    int min = cal.get(Calendar.MINUTE);
    long t=(23-hour)*3600000+(59-min)*60000;

    t=start+t;

    int diff=0;
    if(end>t){
        diff=(int)((end-t)/ TimeUnit.DAYS.toMillis(1))+1;
    }

    return  diff;
}

Respondido el 09 de enero de 17 a las 05:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.