it-swarm.com.de

Wie bekomme ich einen Unterschied zwischen zwei Datumsangaben in Android?

Ich habe den ganzen Beitrag hier gesehen und kann immer noch nicht herausfinden, wie sich zwei Android-Daten unterscheiden.

Das ist was ich mache:

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

und ich bekomme: das Datum ist der 1. Januar 1970 und die Zeit ist in zwei Stunden immer größer. Ich komme aus Israel, also sind die zwei Stunden Zeitoffset.

Wie kann ich normale Unterschiede bekommen ???

19
Alex Kapustian

Sie sind der richtigen Antwort nahe, Sie erhalten die Differenz in Millisekunden zwischen diesen beiden Datumsangaben. Wenn Sie jedoch versuchen, aus dieser Differenz ein Datum zu erstellen, wird davon ausgegangen, dass Sie ein neues Date-Objekt mit diesem Differenzwert erstellen möchten seine Epoche. Wenn Sie nach einer Zeit in Stunden suchen, müssen Sie einfach einige grundlegende Arithmetik für diese diff ausführen, um die verschiedenen Zeitabschnitte zu erhalten:

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

Alle diese Berechnungen führen einfach eine Ganzzahlarithmetik durch, sodass alle Dezimalstellen abgeschnitten werden

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

Einige Zusatz: Hier konvertiere ich den String in das Datum und vergleiche die aktuelle Uhrzeit. 

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

Verwenden Sie Java.time.Duration:

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

Das wird so etwas drucken

PT109H27M21S

Dies bedeutet einen Zeitraum von 109 Stunden 27 Minuten 21 Sekunden. Wenn Sie etwas mehr für den Menschen lesbarer machen möchten, gebe ich zuerst die 9-Version. Es ist am einfachsten:

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

Jetzt bekommen wir

4 days 13 hours 27 minutes 21 seconds

Die Duration-Klasse ist Teil von Java.time der modernen Java-API für Datum und Uhrzeit. Dies ist auf neueren Android-Geräten gebündelt. Holen Sie sich auf älteren Geräten ThreeTenABP, fügen Sie es Ihrem Projekt hinzu und stellen Sie sicher, dass Sie org.threeten.bp.Duration und andere Datums-/Uhrzeit-Klassen importieren, die Sie möglicherweise aus demselben Paket benötigen.

Angenommen, Sie haben noch keine Java 9-Version, können Sie die größeren Einheiten der Reihe nach abziehen, um die kleineren zu erhalten:

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

Dann können Sie die vier Variablen wie oben formatieren.

Was hast du falsch gemacht?

Eine Date steht für einen Zeitpunkt. Es war nie dafür gedacht, eine Zeit, eine Dauer darzustellen, und es ist nicht dafür geeignet. Der Versuch, diese Arbeit auszuführen, würde am besten zu verwirrendem und schwer zu wartendem Code führen. Sie wollen das nicht, also bitte nicht.

Links

2
Ole V.V.

Hier ist meine Antwort basierend auf @Ole V. V. Antwort.

Dies funktioniert auch mit 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();
}

Es funktioniert mit einem StringBuilder, um alles zusammenzufügen.

1

Verwenden Sie diese Funktionen

    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

Mit georgischem Kalander 

 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