wake-up-neo.net

Vergleichen Sie nur den Zeitanteil von zwei Datumsangaben und ignorieren Sie den Datumsteil

Was ist eine gute Methode, um bei zwei Date-Objekten den Unterschied zwischen nur ihrem Zeitanteil zu vergleichen und Jahr, Monat und Tag vollständig zu ignorieren?

Es ist genau das Gegenteil von dieser Frage .

UPDATE: Hier ist der endgültige Code für zukünftige Referenz:

private long differenceBetween(Date currentTime, Date timeToRun)
{
    Calendar currentCal = Calendar.getInstance();
    currentCal.setTime(currentTime);

    Calendar runCal = Calendar.getInstance();
    runCal.setTime(timeToRun);
    runCal.set(Calendar.DAY_OF_MONTH, currentCal.get(Calendar.DAY_OF_MONTH));
    runCal.set(Calendar.MONTH, currentCal.get(Calendar.MONTH));
    runCal.set(Calendar.YEAR, currentCal.get(Calendar.YEAR));

    return currentCal.getTimeInMillis() - runCal.getTimeInMillis();
}
30
kolrie

Wenn Sie die zugrunde liegenden binären Werte (long int) der Datumsangaben vergleichen möchten, können Sie Folgendes tun:

public int compareTimes(Date d1, Date d2)
{
    int     t1;
    int     t2;

    t1 = (int) (d1.getTime() % (24*60*60*1000L));
    t2 = (int) (d2.getTime() % (24*60*60*1000L));
    return (t1 - t2);
}

Nachtrag 1

Diese Technik hat den Vorteil der Geschwindigkeit, da sie den zugrunde liegenden long-Wert der Date-Objekte direkt verwendet, anstatt zwischen Ticks und Kalenderkomponenten zu konvertieren (was ziemlich teuer und langsam ist). Es ist auch viel einfacher, als mit Calendar-Objekten herumzuspielen.

Nachtrag 2

Der obige Code gibt die Zeitdifferenz als int zurück, die für jedes Paar von Zeitpunkten korrekt ist, da die Jahres-/Monats-/Tagesabschnitte des Datums vollständig ignoriert werden und die Differenz zwischen zwei beliebigen Zeitpunkten nicht mehr als 86.400.000 ms beträgt ( = 1000 ms/s × 60 s/min × 60 min/h × 24 h/Tag.

31
David R Tribble

Sie können die Funktion DateTimeComparator.getTimeOnlyInstance() von Joda time für einen Vergleicher in Betracht ziehen, der zwei Joda-Datumsangaben nur auf der Grundlage der Zeiten vergleicht.

Zum Beispiel:

DateTimeComparator comparator = DateTimeComparator.getTimeOnlyInstance();
comparator.compare(date1, date2);

Siehe http://joda-time.sourceforge.net/api-release/org/joda/time/DateTimeComparator.html#getTimeOnlyInstance ()

19
James

Schauen Sie sich die Klasse Calendar an. Es unterstützt das Extrahieren von Stunden, Minuten und Sekunden aus bestimmten Dates.

Calendar calendar = Calendar.getInstance();
calendar.setTime(yourDateObject);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
5

Falls Sie JODA nicht verwenden können,

erstellen Sie 2 Kalenderobjekte, setzen Sie Jahr, Monat und Tag auf 0.

Vergleiche sie....

1
bbaja42

Wenn JODA keine Option ist, besteht einer der kürzesten Ansätze darin, die Zeit in Strings umzuwandeln und sie dann zu vergleichen.

DateFormat df = new SimpleDateFormat("HHmmssSZ");
df.format(date1).equals(df.format(date2));
1
vanto

wenn Sie nur den zeitlichen Teil der Daten vergleichen möchten, erhalten Sie das richtige Ergebnis. 

public long compareTimes(Date d1, Date d2)
    {
        long     t1;
        long     t2;
        t1 = d1.getHours()*60*60+d1.getMinutes()*60+d1.getSeconds();
        t2 = d2.getHours()*60*60+d2.getMinutes()*60+d2.getSeconds();
        long diff = t1-t2;
        System.out.println("t1 - "+t1+", t2 - "+t2+",  diff - "+diff);

        return diff;
    }
0
Amit

Ich weiß nicht, wie gut geübt oder effizient diese ist, aber ich habe mit dem Date-Objekt eine einfache Funktion geschrieben, die meinen Zwecken dient. Ein wahrer oder falscher Wert ist der erste Datumswert, der größer als der zweite ist. Die Eingänge d1 && d2 sind Datumsobjekte.

function CompareTimes(d1, d2) {
             if (d1.getHours() < d2.getHours()) {
                 return false;
             }
             if (d1.getHours() > d2.getHours()) {
                 return true;

             } else {
                 return (d1.getMinutes() > d2.getMinutes());
             }
};
0
Dennis Puzak