web-dev-qa-db-fra.com

Comment puis-je obtenir la différence entre deux dates dans Android ?, tout essayé et après

J'ai vu tout le message ici et je ne peux toujours pas comprendre comment obtenir une différence entre deux dates Android.

C'est ce que je fais:

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

et je reçois: la date est le 1er janvier 1970 et le temps est toujours plus grand en deux heures ... Je suis d'Israël, alors les deux heures correspondent au décalage horaire.

Comment puis-je obtenir une différence normale ???

19
Alex Kapustian

Vous vous approchez de la bonne réponse, vous obtenez la différence en millisecondes entre ces deux dates, mais lorsque vous essayez de construire une date à partir de cette différence, vous supposez que vous souhaitez créer un nouvel objet Date avec cette valeur de différence, son époque. Si vous recherchez un temps en heures, il vous suffira alors de faire quelques calculs de base sur cette diff pour obtenir les différentes parties de temps:

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

Toute cette mathématique fera simplement de l'arithmétique entière, donc elle tronquera tous les points décimaux

68
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);
19
Dude

Quelques ajouts: Ici, je convertis chaîne en date, puis je compare l'heure actuelle. 

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();
    }
12
Shihab Uddin

Utilisez Java.time.Duration:

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

Cela va imprimer quelque chose comme

PT109H27M21S

Cela signifie une période de temps de 109 heures 27 minutes 21 secondes. Si vous voulez quelque chose de plus lisible par l’homme - je vais tout d’abord donner la version 9, c’est le plus 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);

Maintenant nous avons

4 days 13 hours 27 minutes 21 seconds

La classe Duration fait partie de Java.time l'API de date et heure moderne de Java. Ceci est fourni sur les nouveaux appareils Android. Sur les appareils plus anciens, procurez-vous ThreeTenABP, ajoutez-le à votre projet et assurez-vous d'importer le org.threeten.bp.Duration et les autres classes de date-heure nécessaires dans le même package.

En supposant que vous ne disposiez toujours pas de la version Java 9, vous pouvez soustraire les unités les plus grandes à leur tour pour obtenir les plus petites:

    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();

Ensuite, vous pouvez formater les quatre variables comme ci-dessus.

Qu'as-tu fait de mal?

Une Date représente un point dans le temps. Il n’a jamais été conçu pour représenter une durée, une durée, et cela ne convient pas. Essayer de faire ce travail au mieux conduirait à un code confus et difficile à maintenir. Vous ne voulez pas cela, alors s'il vous plaît, non.

Liens

2
Ole V.V.

Utilisez ces fonctions

    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;
}
0
neal zedlav

Utilisation d'une calandre géorgienne 

 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();


}
0
Syed Danish Haider