Ich muss zwei Date
s (zB date1
und date2
) vergleichen und ein finden, boolean sameDay
das für beide giltDate
am selben Tag gilt, und falsch, wenn dies nicht .
Wie kann ich das machen? Hier scheint es einen Wirbelwind der Verwirrung zu geben ... und ich möchte es vermeiden, andere Abhängigkeiten über das JDK hinaus einzubeziehen, wenn dies überhaupt möglich ist.
zur Verdeutlichung: Wenn date1
und date2
teilen Sie das gleiche Jahr, den gleichen Monat und den gleichen Tag, dann sameDay
ist es wahr, sonst ist es falsch. Mir ist klar, dass dies die Kenntnis einer Zeitzone erfordert ... es wäre schön, eine Zeitzone einzugeben, aber ich kann entweder mit GMT oder Ortszeit leben, solange ich weiß, wie sich das verhält.
noch einmal, um zu verdeutlichen:
date1 = 2008 Jun 03 12:56:03
date2 = 2008 Jun 03 12:59:44
=> sameDate = true
date1 = 2009 Jun 03 12:56:03
date2 = 2008 Jun 03 12:59:44
=> sameDate = false
date1 = 2008 Aug 03 12:00:00
date2 = 2008 Jun 03 12:00:00
=> sameDate = false
Antworten:
Beachten Sie, dass "am selben Tag" kein so einfaches Konzept ist, wie es sich anhört, wenn verschiedene Zeitzonen beteiligt sein können. Der obige Code berechnet für beide Daten den Tag relativ zur Zeitzone, die von dem Computer verwendet wird, auf dem er ausgeführt wird. Wenn dies nicht erforderlich ist, müssen Sie die entsprechenden Zeitzonen an die
Calendar.getInstance()
Anrufe übergeben, nachdem Sie entschieden haben, was genau Sie mit "am selben Tag" meinen.Und ja, Joda Time's
LocalDate
würde das Ganze viel sauberer und einfacher machen (obwohl die gleichen Schwierigkeiten mit Zeitzonen vorhanden wären).quelle
Wie wäre es mit:
Bei Bedarf können Sie die Zeitzone auch auf SimpleDateFormat einstellen.
quelle
SimpleDateFormat
Methode tatsächlich schneller als die andere, die hier mitCalendar
s erwähnt wird. Im Durchschnitt dauert es die Hälfte der Zeit alsCalendar
Methode. (Zumindest auf meinem System). Ein großes Lob!Ich benutze dazu das "apache commons lang" -Paket (nämlich org.apache.commons.lang.time.DateUtils )
quelle
Sie können externe Abhängigkeiten und den Leistungseinbruch bei der Verwendung des Kalenders vermeiden, indem Sie die Julianische Tageszahl für jedes Datum berechnen und diese dann vergleichen:
quelle
Date
kapseln gerade s nicht den Begriff der Zeitzonen, so dass es keine Möglichkeit gibt, dies nicht willkürlich zu beheben.Joda-Zeit
Was das Hinzufügen einer Abhängigkeit betrifft, befürchte ich, dass java.util.Date & .Calendar wirklich so schlecht sind, dass ich bei jedem neuen Projekt als erstes die Joda-Time-Bibliothek hinzufüge. In Java 8 können Sie das neue Paket java.time verwenden, das von Joda-Time inspiriert ist.
Der Kern von Joda-Time ist die
DateTime
Klasse. Im Gegensatz zu java.util.Date versteht es die zugewiesene Zeitzone (DateTimeZone
). Weisen Sie beim Konvertieren von juDate eine Zone zu.LocalDate
Eine Möglichkeit zu überprüfen, ob zwei Datums- und Uhrzeitangaben am selben Datum landen, besteht in der Konvertierung in
LocalDate
Objekte.Diese Konvertierung hängt von der zugewiesenen Zeitzone ab. Vergleichen
LocalDate
Objekte können, müssen sie mit derselben Zone konvertiert worden sein.Hier ist eine kleine Dienstprogrammmethode.
Besser wäre ein anderes Argument, die Zeitzone anzugeben, anstatt anzunehmen, dass die Zeitzone des ersten DateTime-Objekts verwendet werden sollte.
Zeichenfolgendarstellung
Ein anderer Ansatz besteht darin, eine Zeichenfolgendarstellung des Datumsabschnitts jeder Datums- / Uhrzeit zu erstellen und dann Zeichenfolgen zu vergleichen.
Auch hier ist die zugewiesene Zeitzone entscheidend.
Zeitspanne
Die allgemeine Lösung besteht darin, eine Zeitspanne zu definieren und dann zu fragen, ob die Zeitspanne Ihr Ziel enthält. Dieser Beispielcode befindet sich in Joda-Time 2.4. Beachten Sie, dass die mit "Mitternacht" verbundenen Klassen veraltet sind. Verwenden Sie stattdessen die
withTimeAtStartOfDay
Methode. Joda-Time bietet drei Klassen an, um eine Zeitspanne auf verschiedene Arten darzustellen: Intervall, Periode und Dauer.Verwenden Sie den "Half-Open" -Ansatz, bei dem der Anfang der Spanne inklusive und das Ende exklusiv ist.
Die Zeitzone des Ziels kann sich von der Zeitzone des Intervalls unterscheiden.
java.time
Java 8 und höher wird mit dem Java.time- Framework geliefert . Inspiriert von Joda-Time, definiert durch JSR 310 und erweitert durch das ThreeTen-Extra-Projekt. Siehe Tutorial .
Die Macher von Joda-Time haben uns alle angewiesen, so schnell wie möglich zu java.time zu wechseln. In der Zwischenzeit wird Joda-Time als aktiv gepflegtes Projekt fortgesetzt. Erwarten Sie jedoch, dass zukünftige Arbeiten nur in java.time und ThreeTen-Extra statt in Joda-Time ausgeführt werden.
Um java.time auf den Punkt zu bringen… An
Instant
ist ein Moment auf der Timeline in UTC. Wenden Sie eine Zeitzone (ZoneId
) an, um einZonedDateTime
Objekt zu erhalten. Um die Timeline losfahren, die vage unbestimmte Idee eines Datum-Zeit zu erhalten, verwenden Sie die „lokale“ Klassen:LocalDateTime
,LocalDate
,LocalTime
.Die im Abschnitt Joda-Zeit dieser Antwort beschriebene Logik gilt für java.time.
Die alte Klasse java.util.Date verfügt über eine neue
toInstant
Methode zur Konvertierung in java.time.Das Bestimmen eines Datums erfordert eine Zeitzone.
Wir wenden dieses Zeitzonenobjekt auf das
Instant
an, um a zu erhaltenZonedDateTime
. Daraus extrahieren wir einen Nur-Datum-Wert (aLocalDate
), da unser Ziel darin besteht, Daten (nicht Stunden, Minuten usw.) zu vergleichen.Machen Sie dasselbe mit dem zweiten
java.util.Date
Objekt, das wir zum Vergleich benötigen. Ich werde stattdessen nur den aktuellen Moment nutzen.Verwenden Sie die spezielle
isEqual
Methode, um auf denselben Datumswert zu testen.quelle
LocalDate localDate = LocalDate.fromDateFields(yourJavaUtilDate);
fromDateFields()
In meinerLocalDate
Klasse gibt es keine .Konvertieren Sie Daten in Java 8 java.time.LocalDate wie hier gezeigt .
quelle
ZoneId.of("America/Phoenix")
oderZoneId.of("Europe/Budapest")
anstelle der Systemvorgabe einfach eingeben.Java 8
Wenn Sie Java 8 in Ihrem Projekt verwenden und vergleichen
java.sql.Timestamp
, können Sie die folgendeLocalDate
Klasse verwenden:Wenn Sie verwenden
java.util.Date
, werfen Sie einen Blick auf die Antwort von Istvan, die weniger mehrdeutig ist.quelle
date1
unddate2
sindjava.sql.Timestamp
? Nach der Frage, die sie sindDate
, würde ich verstehenjava.util.Date
. Außerdem verwendet Ihr Code die Zeitzoneneinstellung des Computers, die für viele Zwecke in Ordnung ist. Trotzdem würde ich es vorziehen, diese Tatsache im Code explizit zu machen.java.sql.Timestamp
. Wie Sie sagten, ist es im Allgemeinen besser, die Zeitzone explizit festzulegen.quelle
FÜR ANDROID-BENUTZER:
Sie können verwenden
DateUtils.isToday(dateMilliseconds)
überprüfen, ob das angegebene Datum der aktuelle Tag ist oder nicht.API-Referenz: https://developer.android.com/reference/android/text/format/DateUtils.html#isToday(long)
quelle
DateUtils.isToday(x.getTime())
(x ist eine java.util.date-Instanz) wird tunzusätzlich zur Binil Thomas Lösung
Verwendung
quelle
Für Kotlin-Entwickler ist dies die Version mit dem Vergleich formatierter Zeichenfolgen:
Es ist nicht der beste Weg, aber es ist kurz und funktioniert.
quelle
SimpleDateFormat
Klasse wurde vor Jahren durch diejava.time.DateTimeFormatter
in JSR 310 definierte moderne Klasse ersetzt. Die Verwendung im Jahr 2019 vorzuschlagen, ist ein schlechter Rat.Sie können dieselbe Logik wie die SimpleDateFormat-Lösung anwenden, ohne sich auf SimpleDateFormat verlassen zu müssen
quelle