2013-07-05 17 views
7

Ich stieß auf ein Problem, bei dem ich zwei Daten vergleichen wollte. Ich wollte jedoch nur Jahr, Monat und Tag vergleichen. Und das ist, was ich kann oben mit:So entfernen Sie Millisekunden, Sekunden, Minuten und Stunden von Datum

private Date trim(Date date) { 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 
     calendar.set(Calendar.MILLISECOND, 0); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.HOUR, 0); 
     return calendar.getTime(); 
    } 

I Benutzer diese Funktion, um alle Einheiten zu trimmen, sondern Tage, Monate und Jahre.

Jetzt ist die Frage, was denkst du darüber? Kennen Sie einen anderen Weg?

Dank

+2

ich verstehe wirklich nicht, wo das Problem steht ?? –

+0

scheint wie sauberer Code, jeder andere Code Zugriff auf die Date-Klasse wäre wahrscheinlich größer warum würden Sie wirklich lol ändern. – SSpoke

+1

Ist die Zeitzone des Benutzers, für den Sie die Ausgabe generieren, der gleiche wie der der Plattform, auf der JVM läuft? :) – Affe

Antwort

2

Ich nehme an, Sie zwei Daten vergleichen möchten, wo in Ihnen nur die year, month und day vergleichen möchten.

Was Sie getan haben, ist in Ordnung, d.h. Entfernen der hour, minute, second und millisecond. Sie müssen dies mit beiden Daten tun.

Sobald das Trimmen abgeschlossen ist, müssen Sie die compareTo Methode in der Date Klasse verwenden.

können Sie den folgenden Code verwenden -

if(date1.compareTo(date2) < 0) { 
    // date1 is earlier 
} else if(date1.compareTo(date2) > 0) { 
    // date 2 is earlier 
} else { 
    // both dates are equal 
}  
+1

Ich glaube nicht, dass ich das wirklich brauche. date1.before (date2) scheint besser zu sein. – Adelin

+1

Yup. Ich hoffe, ich konnte dir helfen. – JHS

6

Ihr Code funktioniert und ist leicht zu lesen. Ich sehe kein Problem oder Grund, es zu ändern.

+0

Vielen Dank dafür. Aber ich suchte nach Antworten wie "Stephen C" Antwort. – Adelin

4

Jetzt ist die Frage, was machen Sie dabei?

Es sieht einfach und vernünftig aus. Sie erstellen ein neues Date und ein temporäres Objekt Calendar, aber das ist nur ein kleiner Overhead. (... es sei denn, Sie verwenden dies, um eine große Datenstruktur zu sortieren/zu sortieren ...)

IMO, es gibt wahrscheinlich keine Notwendigkeit, es zu ändern.

Kennen Sie einen anderen Weg?

  1. entwickeln/verwenden, um eine Comparator<Date>, die nur die Felder verwendet, die Sie interessieren, ein Calendar mit ihnen zu extrahieren.

    Ob dies hilfreich ist, hängt davon ab, wie Sie gerade die Vergleiche durchführen. Ein Komparator kann besser sein. Aber die Kehrseite ist, dass Sie am Ende wiederholt die Konvertierungen durchführen können, und Comparator<Date> gibt Ihnen keinen Spielraum für das Zwischenspeichern der konvertierten Daten.

  2. Führen Sie die Berechnung mit den von Date.getTime() zurückgegebenen Werten durch. Etwa so:

    long val = date.getTime(); // milliseconds since 'epoch' in UTC 
    val = val + /* local timezone offset in milliseconds */ 
    long day = val/(1000 * 60 * 60 * 24); // days since "local" epoch. 
    
    // repeat for other Date, and compare the 'day' numbers as integers 
    

    Erklärung sollte es effizienter sein, einige einfache Arithmetik zu tun, als einen verwendet Calendar (oder was auch immer). Der Code ist ein wenig obskurer, aber es sollte für jemanden mit vernünftigen mathematischen Fähigkeiten offensichtlich sein.

+0

Danke, diese Antwort ist, was ich gesucht habe. – Adelin

+0

Der zweite Vorschlag berücksichtigt keine Änderungen für Sommerzeit oder Schaltsekunden. Es würde Ihnen nur sagen, ob die beiden Daten innerhalb von 24 Stunden zueinander lagen, was Sie viel einfacher durch die Berechnung der Anzahl der Millisekunden in 24 Stunden erreichen könnten. Es sei denn, das ist genau das, was Sie wollen, dann verwenden Sie einfach Ihren vorhandenen Code, der für den Leser * viel * offensichtlich ist, was seine Absichten betrifft. – SimonC

+0

@SimonC - der relevante "Code" ist eigentlich ein Kommentar. Ob die Sommerzeit (oder nicht) berücksichtigt wird, hängt davon ab, wie Sie sie implementieren. (Aber ja, das macht die Dinge komplizierter.) Ich bin mir ziemlich sicher, dass Sprungsekunden irrelevant sind. Sie arbeiten, indem sie die UTC-Grundlinienzeit anpassen ... –

0

du versuchen können, weil die Formate der Fixtermine bleiben:

String first = date1.toString().substring(4,10) + " " + date.toString().substring(24, 28); 
    String second = date2.toString().substring(4,10) + " " + date.toString().substring(24, 28); 

die folgende Ausgabe

31 Dez 1969

6. Januar 1969

Und dann vergleiche die Ergebnisse.

return (first.equals(second)); 

Ich weiß nicht, ob es besser ist als Ihre Idee, aber Sie erhalten das gleiche Ergebnis.

+1

Dies funktioniert nur, wenn Sie die Daten für die Gleichheit vergleichen möchten. Und es ist wirklich ineffizient ... und NICHT-TRAGBAR, denn wenn es auf die Standard-Formatierung der Zeichenfolgen ankommt, die länderspezifisch ist. –

+0

Danke für die Antwort, aber ich kann nicht Benutzer if (date1.before (date2)) ... :) – Adelin

8

Müssen Sie wirklich java.util.Date verwenden? Wenn Sie joda time wechseln können, finden Sie sehr nette Features wie:

dateTime.dayOfMonth().roundFloorCopy() 

das ist genau das tut, was Sie brauchen.

+0

Dies ist eine Art von Antworten, die ich suchte, aber mein Projekt ist klein und ich brauche nicht um weitere Abhängigkeiten hinzuzufügen :) – Adelin

+0

Joda ist heutzutage eine Art Mainstream, also ist es nicht so, dass du dir Sorgen machen solltest, eine obskure Bibliothek zu benutzen ... Egal wie klein das Projekt ist, wenn du Logging machen willst, solltest du slf4j benutzen Wenn Sie Tests schreiben - Tests, und wenn Sie sich Gedanken über Datum und Uhrzeit machen, dann brauchen Sie Joda (oder ihre Alternativen, natürlich - wollen Sie hier keinen religiösen Krieg beginnen). –

+0

Sie haben Recht, vielleicht in der Zukunft werde ich Joda hinzufügen – Adelin

Verwandte Themen