Fahren Sie mit dem Java-Programm " Stapelüberlauf " fort, um das aktuelle Datum ohne Zeitstempel abzurufen :
Was ist der effizienteste Weg, um ein Date-Objekt ohne Zeit zu erhalten? Gibt es einen anderen Weg als diese beiden?
// Method 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dateWithoutTime = sdf.parse(sdf.format(new Date()));
// Method 2
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
dateWithoutTime = cal.getTime();
Update :
Ich wusste von Joda-Time ; Ich versuche nur, zusätzliche Bibliothek für eine so einfache (glaube ich) Aufgabe zu vermeiden. Aber basierend auf den bisherigen Antworten scheint Joda-Time äußerst beliebt zu sein, also könnte ich es in Betracht ziehen.
Mit effizient meine ich, dass ich die temporäre Objekterstellung vermeiden möchte,
String
wie sie von verwendet wirdmethod 1
. In der Zwischenzeitmethod 2
scheint dies eher ein Hack als eine Lösung zu sein.
Antworten:
Haben Sie unbedingt haben zu verwenden
java.util.Date
? Ich würde durchaus empfehlen , dass Sie Joda Zeit oder dasjava.time
Paket von Java 8 statt. Insbesondere während Datum und Kalender immer einen bestimmten Zeitpunkt darstellen, ohne solches Konzept als „nur ein Datum“, Joda Zeit hat eine Art haben repräsentiert diese (LocalDate
). Ihr Code wird viel klarer, wenn Sie Typen verwenden können, die das darstellen, was Sie tatsächlich versuchen.Es gibt viele, viele andere Gründe, Joda Time oder
java.time
anstelle der integriertenjava.util
Typen zu verwenden - sie sind im Allgemeinen weitaus bessere APIs. Sie können jederzeitjava.util.Date
an den Grenzen Ihres eigenen Codes nach / von a konvertieren, wenn dies erforderlich ist, z. B. für die Datenbankinteraktion.quelle
Date
Objekt erhält - diese Antwort formatiert ein Datum für eine Zeichenfolge, was nicht dasselbe ist. Grundsätzlich ist die Frage nach dem Datum aDate
eine bedeutungslose Frage ohne weitere Informationen: die Zeitzone und das von Ihnen verwendete Kalendersystem.Folgendes habe ich verwendet, um das heutige Datum mit der eingestellten Zeit zu erhalten
00:00:00
:quelle
Sie können DateUtils.truncate aus der Apache Commons-Bibliothek verwenden.
Beispiel:
quelle
Ja da ist.
java.time
In Java 8 und höher ist das neue Paket java.time integriert. Siehe Tutorial . Ein Großteil der Funktionen von java.time wird in ThreeTen-Backport auf Java 6 & 7 zurückportiert und in ThreeTenABP weiter an Android angepasst .
Ähnlich wie bei Joda-Time bietet java.time a
LocalDate
Klasse, die einen Nur-Datum-Wert ohne Tageszeit und ohne Zeitzone darstellt.Beachten Sie, dass die Zeitzone für die Bestimmung eines bestimmten Datums von entscheidender Bedeutung ist. Zum Beispiel um Mitternacht in Paris ist das Datum in Montréal immer noch „gestern“.
Standardmäßig verwendet java.time den Standard ISO 8601, um eine Zeichenfolgendarstellung eines Datums oder eines Datums- / Uhrzeitwerts zu generieren. (Eine weitere Ähnlichkeit mit Joda-Time.) Rufen Sie einfach
toString()
an, um Text wie zu generieren2015-05-21
.Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration auf java.time Klassen .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden
Interval
,YearWeek
,YearQuarter
, und mehr .quelle
TimeZone.setDefault
Laufzeit aufgerufen werden und wirkt sich sofort auf alle anderen Codes aus, die in dieser JVM ausgeführt werden. Moral der Geschichte: Geben Sie immer eine Zeitzone an.Der einfachste Weg:
quelle
long dateOnly = (currentTime / millisInDay) * millisInDay;
dasselbe wie Schreibenlong dateOnly = currentTime;
?Die Standardantwort auf diese Fragen ist die Verwendung von Joda Time . Die API ist besser und wenn Sie die Formatierer und Parser verwenden, können Sie den nicht intuitiven Mangel an Thread-Sicherheit von vermeiden
SimpleDateFormat
.Mit Joda können Sie einfach Folgendes tun:
Update :: Mit Java 8 kann dies mit erreicht werden
quelle
LocalDate
ähnliche Klasse wie Joda-Time.DateTimeZone
an diesen LocalDate-Konstruktor übergeben. Die Bestimmung des aktuellen Datums hängt von der Zeitzone ab, da Paris ein neues Datum früher als Montréal beginnt. Wenn Sie die Zeitzone weglassen, wird die Standardzeitzone Ihrer JVM angewendet. Normalerweise besser anzugeben als sich auf die Standardeinstellungen zu verlassen.Dies ist eine einfache Methode:
quelle
Es ist nicht sinnvoll, über ein Datum ohne Zeitstempel in Bezug auf die Datumsroutinen in der Standard-Java-Laufzeit zu sprechen, da es im Wesentlichen auf eine bestimmte Millisekunde und nicht auf ein Datum abgebildet wird. Mit dieser Millisekunde ist an sich eine Tageszeit verbunden, die sie für Zeitzonenprobleme wie Sommerzeit und andere Kalenderanpassungen anfällig macht. Siehe Warum führt das Subtrahieren dieser beiden Male (1927) zu einem seltsamen Ergebnis? für ein interessantes Beispiel.
Wenn Sie mit Datumsangaben anstelle von Millisekunden arbeiten möchten, müssen Sie etwas anderes verwenden. Für Java 8 gibt es eine Reihe neuer Methoden, die genau das bieten, wonach Sie fragen. Verwenden Sie für Java 7 und frühere Versionen http://www.joda.org/joda-time/
quelle
Auf jeden Fall nicht der richtigste Weg, aber wenn Sie nur eine schnelle Lösung benötigen, um das Datum ohne Uhrzeit zu erhalten, und keine Bibliothek eines Drittanbieters verwenden möchten, sollte dies der Fall sein
Ich brauchte das Datum nur für visuelle Zwecke und konnte Joda nicht, also habe ich einen Teilstring gemacht.
quelle
quelle
Soweit ich weiß, gibt es keinen einfacheren Weg, dies zu erreichen, wenn Sie nur das Standard-JDK verwenden.
Sie können diese Logik in Methode2 natürlich in eine statische Funktion in einer Hilfsklasse einfügen , wie hier in der toBeginningOfTheDay-Methode
Dann können Sie die zweite Methode verkürzen auf:
Wenn Sie den aktuellen Tag in diesem Format wirklich so oft benötigen, können Sie ihn einfach in eine andere statische Hilfsmethode einwickeln und ihn so zu einem Einzeiler machen.
quelle
Wenn Sie nur das Datum wie "JJJJ-MM-TT" ohne all die anderen Unordnung sehen möchten, z. B. "Do 21. Mai 12:08:18 EDT 2015", dann verwenden Sie einfach
java.sql.Date
. In diesem Beispiel wird das aktuelle Datum abgerufen:Auch
java.sql.Date
ist eine Unterklasse vonjava.util.Date
.quelle
Wenn Sie nur das aktuelle Datum ohne Uhrzeit benötigen, ist eine andere Option:
quelle
00:00:00
normalerweise der Fall ist (kann bei Anomalien wie der Sommerzeit je nach Zeitzone variieren ). Wie in anderen Antworten erwähnt, ist dieLocalDate
Klasse von Joda-Time besser geeignet (vorausgesetzt, Sie verweisen auf Joda-Time - was Sie explizit beachten sollten, wenn Sie Klassen zitieren, die nicht mit Java gebündelt sind).Verwenden
LocalDate.now()
und konvertieren SieDate
wie folgt:quelle
TimeZone.setDefault
. Ihr Code ruftZoneId.systemDefault
zweimal auf, der erste ist implizit inLocalDate.now()
und der zweite ist explizit mitatStartOfDay
. Zwischen diesen beiden Momenten zur Laufzeit kann sich die aktuelle Standardzone ändern. Ich schlage vor, die Zone in einer Variablen zu erfassen und an beide Methoden zu übergeben.Wenn Sie den Datumsteil nur zum Echo benötigen, dann
quelle
Was ist damit?
quelle
Schauen Sie sich die Veyder-Zeit an . Es ist eine einfache und effiziente Alternative zu java.util und Joda-time. Es verfügt über eine intuitive API und Klassen, die nur Datumsangaben ohne Zeitstempel darstellen.
quelle
Der geradlinigste Weg, der die riesige TimeZone-Datenbank von Java voll ausnutzt und richtig ist:
quelle
Hier ist eine saubere Lösung ohne Konvertierung in String und Back. Außerdem wird die Zeit nicht mehrmals neu berechnet, wenn Sie jede Komponente der Zeit auf Null zurücksetzen. Es verwendet auch
%
(Modul) anstelle von Teilen und anschließendem Multiplizieren verwendet, um die Doppeloperation zu vermeiden.Es sind keine Abhängigkeiten von Drittanbietern erforderlich, und es wird die Zeitzone des übergebenen Kalenderobjekts respektiert. Diese Funktion gibt den Zeitpunkt um 12 Uhr in der Zeitzone des von Ihnen übergebenen Datums (Kalenders) zurück.
quelle
Verwenden Sie lieber keine Bibliotheken von Drittanbietern. Ich weiß, dass dieser Weg bereits erwähnt wurde, aber hier ist ein schöner, sauberer Weg:
GregorianCalendar nicht zu verwenden ist vielleicht eine Option!
quelle
Ich habe das gerade für meine App gemacht:
Android API Level 1, keine externe Bibliothek. Es berücksichtigt Tageslicht und Standardzeitzone. Keine String-Manipulation, daher denke ich, dass dieser Weg CPU-effizienter ist als der Ihre, aber ich habe keine Tests durchgeführt.
quelle
Sie können Joda-Zeit verwenden.
und du rufst an mit:
quelle