Informationen zum Java-Stichtag

120

Ich habe ein Java-Datumsobjekt mit Datums- und Uhrzeitinformationen. Ich möchte eine Methode schreiben, die die Zeitinformationen abschneidet, die Stunden-Minuten-Sekunden abschneidet, sodass nur noch das Datum übrig ist.

Beispieleingabe:

2008-01-01 13:15:00

Erwartete Ausgabe:

2008-01-01 00:00:00

Hast du einen tipp Ich habe versucht, so etwas zu tun:

(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)

aber ich hatte Probleme mit der Zeitzone.

Marco
quelle

Antworten:

178

Die empfohlene Methode zur Manipulation von Datum und Uhrzeit ist die Verwendung eines CalendarObjekts:

Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();
Cletus
quelle
2
@cletus, Ist es möglich, die Uhrzeit aus dem Datumsobjekt zu entfernen? Ich möchte reines Datum wie 2008-01-01 keinen Zeitanteil.
Prem
2
Ich würde nicht sagen, dass java.util.Calendar empfohlen wird. Sun / Oracle hat diese Klasse in Java 8 durch das neue Paket java.time ersetzt. Verwenden Sie entweder das oder Joda-Time.
Basil Bourque
3
Kalender wird nicht mehr empfohlen. Siehe stackoverflow.com/a/28868089/40064, wenn Sie Java 8 verwenden.
Wim Deblauwe
2
Zu Ihrer Information , die problematischen alten Datums- / Uhrzeitklassen, wie sie java.util.Calendarjetzt Legacy sind , werden durch die Klassen java.time ersetzt . Siehe Tutorial von Oracle .
Basil Bourque
147

Haben Sie sich die Methode zum Abschneiden von DateUtils in Apache Commons Lang angesehen?

Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);

entfernt das Zeitelement.

A_M
quelle
9
Link erneut aktualisiert (komm auf Apache! Hör auf, deine Dokumente zu bewegen!)
Ogre Psalm33
6
Abgesehen von diesem Ansatz ist die Zeitzone, in der die Kürzungsoperation ausgeführt wird, immer die lokale PC-Zeitzone. Wenn Sie also mit Kalender und Datumsangaben in der UTC-Zeitzone oder in einer anderen Zeitzone als der lokalen Zeitzone arbeiten, wird das Datum möglicherweise nicht wie beabsichtigt abgeschnitten.
Wolke
Wie @Cloud betonte, macht mich die Tatsache, dass ich die Kalenderinstanz hier nicht sehe (keine Kontrolle darüber habe), etwas nervös :)
Jaroslav Záruba
Diese Methode ist überraschend lang und hatte mindestens zwei Bugfixes.
Pino
42

Hast du Joda angeschaut ? Es ist eine viel einfachere und intuitivere Möglichkeit, mit Datum und Uhrzeit zu arbeiten. Zum Beispiel können Sie trivial zwischen (sagen wir) LocalDateTime- und LocalDate- Objekten konvertieren .

zB (zur Veranschaulichung der API)

LocalDate date = new LocalDateTime(milliseconds).toLocalDate()

Darüber hinaus werden einige Probleme mit der Thread-Sicherheit mit Datums- / Zeitformatierern behoben und es wird dringend empfohlen, mit Datums- / Uhrzeitproblemen in Java zu arbeiten.

Brian Agnew
quelle
12
Ich glaube schon. Es ist eine Empfehlung, eine bessere Bibliothek zu verwenden, anstatt mit den kaputten java.util-Klassen zu kämpfen (wie aus der Frage hervorgeht)
Brian Agnew,
10
Natürlich ist Joda DIE Bibliothek für die Manipulation von Datum, Uhrzeit und Kalender in Java. Es wäre eine Pflichtverletzung, es nicht zu empfehlen.
Joel
1
Das Thread-Sicherheitsproblem ist sehr interessant. In diesem Beitrag wurde ein Oracle / Hibernate-Fehler "IllegalArgumentException, sun.util.calendar.ZoneInfo.getOffset (ZoneInfo), oracle.jdbc.driver.DateCommonBinder.zoneOffset (OraclePreparedStatement)" untersucht. Hier geht es um andere Oracle-Probleme, die nur in Forums mit hoher Last auftreten.oracle.com/forums/thread.jspa?threadID=325576 Es ist wirklich schwierig, ein Objekt mit ungültigen Millisekunden im normalen Code zu erstellen. Für mich denke ich, dass ich mit Joda in meinem Thread niedergeschlagen werde, anstatt Oracle das möglicherweise verdächtige Nicht-Joda-Zeug verwenden zu lassen.
Mark Bennett
4
Ich wünschte, ich könnte jeden ablehnen, der dies positiv bewertet hat. Wer sind all diese Leute, die +1 eine Antwort geben, die nicht einmal versucht, die Frage zu beantworten? Eine Antwort mit Joda wäre mehr als willkommen, aber das ist es nicht ...
Ryan
1
@ Ryan Wie ist diese Antwort nicht relevant? In der Frage wurde nach dem Datum ohne Tageszeit gefragt. Diese Antwort stellt eine Klasse dar, deren einziger Zweck darin besteht, ein Datum ohne Tageszeit darzustellen.
Basil Bourque
35

Nur ein kurzes Update angesichts der java.time- Klassen, die jetzt in Java 8 und höher integriert sind.

LocalDateTimehat eine truncatedToMethode, die effektiv auf das eingeht, worüber Sie hier sprechen:

LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)

Dies drückt die aktuelle Zeit nur auf Minuten aus:

2015-03-05T11:47

Sie können ein ChronoUnit(oder ein TemporalUnit) kleiner als DAYS verwenden, um die Kürzung auszuführen (da die Kürzung nur auf den Zeitteil von LocalDateTime angewendet wird, nicht auf den Datumsteil).

Adam Berry
quelle
3
Sie können ChronoUnits nur bis zu TAGEN verwenden - höhere Einheiten lösen eine Ausnahme aus.
Assylias
26
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
date = cal.getTime();
Jitter
quelle
22

Mit Joda können Sie leicht das erwartete Datum erhalten.

Ab Version 2.7 (möglicherweise seit einer früheren Version größer als 2.2) wurde, wie ein Kommentator feststellt, toDateMidnightzugunsten oder des treffend benannten abgelehnt withTimeAtStartOfDay(), was die Bequemlichkeit erleichtert

DateTime.now().withTimeAtStartOfDay()

möglich.

Nutzen Sie eine viel schönere API.

Mit älteren Versionen können Sie dies tun

new DateTime(new Date()).toDateMidnight().toDate()
h7r
quelle
6
Die mitternachtsbezogenen Methoden und Klassen in Joda-Time sind jetzt veraltet. Die Entwickler raten davon ab, sie zu verwenden. Verwenden Sie stattdessen die Methode withTimeAtStartOfDay.
Basil Bourque
Vielen Dank für den Hinweis. Die Antwort wurde aktualisiert, um dies zu berücksichtigen.
7.
Sie können auch toLocalDateein Objekt abrufen, das nicht einmal eine Zeitkomponente enthält.
Charles Wood
Zu Ihrer Information , das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time . Siehe Tutorial von Oracle .
Basil Bourque
8

Ich habe die Kürzung mit der neuen Java8-API durchgeführt. Ich habe mich einer seltsamen Sache gestellt, aber im Allgemeinen ist sie abgeschnitten ...

Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);
Sergio Kosik
quelle
Schlüsselwörter: java.time, Java 8, LocalDateTime.truncatedTo ()
Alexander Taylor
1
Diese Antwort erzeugt nur Daten für den Kontext der UTC-Zeitzone.
Basil Bourque
6

Verwenden Sie DateUtils von Apache mit Kürzung wie folgt:

DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);
Byron Marambio Troncoso
quelle
Dies wird in der lokalen Zeitzone abgeschnitten, nicht in der UTC, die das Datum (getTime) darstellt.
Epox
6

Für Zeitstempel:

timestamp -= timestamp % (24 * 60 * 60 * 1000)
Gan Quan
quelle
3
In diesem Code ist ein kleiner Fehler aufgetreten - die linke Klammer ist nicht richtig platziert, es muss sich um einen Zeitstempel handeln - = Zeitstempel% (24 * 60 * 60 * 1000). Dadurch wird der Zeitteil abgeschnitten. Und ich bin mir sicher, dass dieser Weg mehr ausreicht, als ein Caledar-Objekt zu erstellen und mit seinen Methoden zu spielen oder sogar andere Bibliotheken von Drittanbietern zu verwenden
Stan
2
Nein, dies ist NICHT die richtige Lösung, ACHTUNG. Dies entspricht dem Runden des Datumswerts auf den Boden, dh Sie erhalten möglicherweise den 28. März für den Zeitstempel vom 29. März (in Ihrem Gebietsschema). Daher sind kalenderbasierte Lösungen (Apaches DateUtils verwendet auch Kalender) der einzige Weg
Drew
Dies funktioniert auch nicht, wenn sich die Zeit aufgrund der Sommerzeit ändert.
Alexandru Severin
5

Aus java.util.Date JavaDocs:

Die Klasse Datum repräsentiert einen bestimmten Zeitpunkt mit einer Genauigkeit von Millisekunden

und aus dem java.sql.Date JavaDocs:

Um der Definition von SQL DATE zu entsprechen, müssen die von einer java.sql.Date-Instanz umschlossenen Millisekundenwerte "normalisiert" werden, indem die Stunden, Minuten, Sekunden und Millisekunden in der bestimmten Zeitzone, der die Instanz zugeordnet ist, auf Null gesetzt werden .

Der beste Ansatz ist also, java.sql.Date zu verwenden, wenn Sie den Zeitteil nicht benötigen

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());

und die Ausgabe ist:

java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date  : 2012-04-26
Sunil Manheri
quelle
4

tl; dr

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString()                                     // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.

2008-01-01T00: 00 + 01: 00 [Europa / Paris]

Übergeben Sie a, um einen String in Ihrem gewünschten Format zu generieren DateTimeFormatter.

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format(                                        // Generate a String representing the object’s value.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME       // Built-in predefined formatter close to what you want. 
)
.replace( "T" , " " )                           // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.

2008-01-01 00:00:00

Einzelheiten

Andere Antworten sind korrekt, verwenden jedoch alte Datums- und Uhrzeitklassen, die jetzt vom java.time-Framework veraltet sind.

java.time

Das java.time-Framework ist in Java 8 und höher integriert. Ein Großteil der Funktionen von java.time wird auf Java 6 & 7 ( ThreeTen-Backport ) zurückportiert und weiter an Android ( ThreeTenABP ) angepasst .

Ändern Sie zuerst die Eingabezeichenfolge, um der kanonischen Version des ISO 8601-Formats zu entsprechen. Die Standardformate ISO 8601 werden standardmäßig in java.time-Klassen zum Parsen / Generieren von Zeichenfolgen verwendet, die Datums- und Uhrzeitwerte darstellen. Wir müssen diesen SPACE in der Mitte durch a ersetzen T.

String input = "2008-01-01 13:15:00".replace( " " , "T" );  // → 2008-01-01T13:15:00

Jetzt können wir es als a analysieren LocalDateTime, wobei "Lokal" keinen bestimmten Ort bedeutet. Dem Eingang fehlen Informationen zum Versatz von UTC oder Zeitzone.

LocalDateTime ldt = LocalDateTime.parse( input );

ldt.toString ()… 2008-01-01T13: 15: 00

Wenn Sie sich weder für die Tageszeit noch für die Zeitzone interessieren, konvertieren Sie zu a LocalDate.

LocalDate ld = ldt.toLocalDate();

ld.toString ()… 2008-01-01

Erster Moment des Tages

Wenn Sie stattdessen möchten, dass die Uhrzeit auf den ersten Moment des Tages festgelegt wird, verwenden Sie eine ZonedDateTimeKlasse und konvertieren Sie sie in ein LocalDateObjekt, um ihre atStartOfDayMethode aufzurufen . Beachten Sie, dass der erste Moment 00:00:00aufgrund der Sommerzeit oder anderer Anomalien möglicherweise nicht die Zeit ist .

Die Zeitzone ist entscheidend, da das Datum für jeden Moment weltweit je nach Zone variiert. Zum Beispiel ist ein paar Momente nach Mitternacht in Paris ein neuer Tag für die Pariser, aber für die Kanadier immer noch „gestern“ in Montréal.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );

zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [Amerika / Montreal]

koordinierte Weltzeit

Extrahieren Sie ein Objekt , um diesen Moment durch die Linse der UTC- Zeitzone zu sehen Instant. Sowohl das ZonedDateTimeals auch Instantwerden den gleichen Moment auf der Zeitachse darstellen, erscheinen jedoch als zwei verschiedene Wanduhrzeiten .

An Instantist die grundlegende Bausteinklasse in java.time, per Definition immer in UTC. Verwenden Sie diese Klasse häufig, da Sie im Allgemeinen Ihre Geschäftslogik, Datenspeicherung und den Datenaustausch in UTC durchführen sollten.

Instant instant = zdtStartOfDay.toInstant();

instant.toString ()… 2008-01-01T05: 00: 00Z

Wir sehen 5 Uhr morgens statt Mitternacht. Im Standardformat steht das Zam Ende für Zuluund bedeutet "UTC".


Ü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 .

Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit fürjava.sql.* Klassen.

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 .

Basil Bourque
quelle
2

Verwenden Sie die Kalender Klasse set()Verfahren die einzustellen HOUR_OF_DAY, MINUTE, SECONDund MILLISECONDFelder auf Null.

Michael Borgwardt
quelle
2

Die Frage ist widersprüchlich. Es wird nach einem Datum ohne Tageszeit gefragt, es wird jedoch ein Beispiel mit einer Uhrzeit von angezeigt 00:00:00.

Joda-Zeit

AKTUALISIEREN: Das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time . Siehe meine andere Antwort für java.time Lösung.

Wenn Sie stattdessen die Tageszeit auf den ersten Moment des Tages einstellen möchten, verwenden Sie a DateTime Objekt in der Joda-Time-Bibliothek und rufen Sie dessen withTimeAtStartOfDayMethode auf. Beachten Sie, dass der erste Moment möglicherweise nicht die Zeit ist, 00:00:00da die Sommerzeit oder andere Anomalien vorliegen.

Basil Bourque
quelle
Dies ist die endgültige Antwort (vorausgesetzt, man kann und will Joda Time verwenden)
Clint Eastwood
2

Nur clear()redundante Felder.

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();

Ab Java 8 ist es besser, die truncatedToMethode zu verwenden LocalDateTime, z.

LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)
m190
quelle
Das funktioniert nicht, weil calendar.clear(Calendar.HOUR_OF_DAY);die Stunden nicht gelöscht werden. Die Lösung von @cletus funktioniert OK.
Arcao
Entschuldigung, Sie haben Recht, ich habe es korrigiert. Stundenlang sollten Sie den Wert einstellen. Im Allgemeinen ist es fast genauso, wie man Datum abschneidet ...
m190
1

Es hat mich wirklich geärgert, dass der neue "verbesserte" Kalenderkonstruktor für Millisekunden kein Int benötigt, wie das "schreckliche" alte Datum. Ich wurde dann richtig böse und schrieb folgendes:

long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);

Ich habe damals nicht das Wort "Zeug" verwendet, aber dann habe ich das Glück entdeckt:

startTime.set(Calendar.MILLISECOND, 0);

Aber ich bin immer noch ziemlich verärgert darüber.

Dave
quelle
1

Ich habe das Problem folgendermaßen behoben (in der Zone Eastern 8 (Pekinger Zeit)):

private Date getTruncatedDate(Date d) {
    if (d == null) {
        return null;
    }
    long h = 60 * 60 * 1000L;
    long dateStamp = d.getTime() - (d.getTime() + 8 * h) % (24 * h);
    return new Date(dateStamp);
}

Zunächst sollte klar sein, was Zeitstempel ist. Der Zeitstempel ist die gesamte Millisekunde vom 01. Januar 00:00:00 1970 von GMT (wie UTC) oder vom 01. Januar 08:00:00 CST 1970 bis heute.

Denken Sie daran: Der Zeitstempel ist unabhängig von der Zeitzone.

Sie erhalten also das gleiche Ergebnis mit der folgenden Anweisung in verschiedenen Zeitzonen:

System.out.println(new Date().getTime());

Und

System.out.println(new Date(0));

druckt verschiedene Zeitinformationen in verschiedenen Zeitzonen: Wenn Sie Ihre PC-Zeitzone auf UTC einstellen, erhalten Sie

Thu Jan 01 00:00:00 UTC 1970

Wenn Sie jedoch die Zeitzone auf (UTC +8: 00) Peking, Chongqing, Hongkong, Urumq einstellen, erhalten Sie:

Thu Jan 01 08:00:00 CST 1970

Java erhält den Zeitstempel und zeigt dann Datums- und Zeitinformationen entsprechend der Zeitzone an.

Für die Einführung, wie Java Datums- und Zeitinformationen in verschiedenen Zeitzonen anzeigt, ist das Trancieren der Zeitinformationen einfach. Sie sollten den Zeitstempel erhalten und die Zeitzone berücksichtigen, wenn Sie die Zeitinformationen abschneiden. Dann können Sie ein neues Datumsobjekt mit dem Schnittzeitstempel erstellen (wir können es Datumsstempel nennen). Java kompensiert die Zeitzone, wenn Datumsinformationen angezeigt werden.

Wie in der östlichen Achtzone (Peking-Zeit) ist die Peking-Zeit 8 Stunden früher als GMT, daher sollten Sie bei der Modulo-Operation mehr 8 Stunden abziehen. Das heißt, Sie sollten zuerst die GMT-Zeit abrufen, dann fügt Java 8 Stunden hinzu, wenn die Anzeigezeit auf der Zeitzoneneinstellung Ihres PCs basiert.


Das Problem mit der Zeitzone ist dunkel und verwirrt mich auch lange. Jetzt mache ich es klar. Hoffnung hilft.


2018-01-04 Die folgende Methode funktioniert auch.

private Date getTruncatedDate2(Date d) {
    Calendar cal = Calendar.getInstance(); // locale-specific
    cal.setTime(d);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);


return cal.getTime();

}}

Gelbert
quelle
Zu Ihrer Information, diese Antwort verwendet lästige alte Datums- / Zeitklassen, die vor Jahren durch die ersetzt wurden Ihrer Information Uhrzeitklassen, die vor Klassen java.time ersetzt wurden .
Basil Bourque
1

Sie können dies tun, um Zeitzonenprobleme zu vermeiden:

public static Date truncDate(Date date) {
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTime();
}

Das Java- DateObjekt ist zwar ein Zeitstempelwert, wird jedoch beim Abschneiden in die lokale Zeitzone konvertiert, sodass Sie einen überraschenden Wert erhalten, wenn Sie einen Wert von der UTC-Zeitzone erwarten.

GMsoF
quelle
Die Probleme Calendarund DateKlassen wurden vor Jahren mit den java.time- Klassen, die JSR 310 in Java 8 und höher implementieren, zum Legacy . Die Verwendung im Jahr 2018 vorzuschlagen, ist ein schlechter Rat.
Basil Bourque
0

Könnte eine späte Antwort sein, aber hier ist eine Möglichkeit, dies in einer Zeile zu tun, ohne Bibliotheken zu verwenden:

new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(YOUR_TIMESTAMP))
Alex
quelle
0

Mit Joda-Time seit Version 2.0 können Sie verwenden LocalDate.toDate().

Einfach

// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();
lamusique
quelle
[A] Ihre Antwort ist überflüssig. Bereits gepostet von Brian Agnew . [B] Ihr Code ist falsch, da er die Zeitzone ignoriert, genau das Problem, das in der Frage aufgeworfen wird.
Basil Bourque
Könnte überflüssig sein, aber ich habe hier nur ein einfacheres Beispiel angeführt, weil ich erkannt habe, dass eine Antwort nicht in Kommentaren enthalten sein sollte. Ja, java.util.Date ignoriert TimeZone, aber die ursprüngliche Frage wurde mit a Java Date objectverwendet java.util.Date. Außerdem erklärt es nicht, wie problematisch seine Zeitzone mit java.util.Date ist (wann? Wo?), Obwohl er nicht anders kann, als andere zu verwenden Date.
Lamusique
0

Für alle Antworten, die den Kalender verwenden, sollten Sie ihn stattdessen so verwenden

public static Date truncateDate(Date date) {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.HOUR_OF_DAY, c.getActualMinimum(Calendar.HOUR_OF_DAY));
    c.set(Calendar.MINUTE, c.getActualMinimum(Calendar.MINUTE));
    c.set(Calendar.SECOND, c.getActualMinimum(Calendar.SECOND));
    c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
    return c.getTime();
}

Aber ich bevorzuge das:

public static Date truncateDate(Date date) {
    return new java.sql.Date(date.getTime());
}
Gast
quelle
Die java.sql.DateKlasse gibt vor, einen Nur-Datum-Wert darzustellen, hat jedoch tatsächlich eine Uhrzeit, die an die UTC-Zeitzone angepasst ist. Also keine wirklich passende Lösung für die Frage.
Basil Bourque
0

Wenn Sie Java 8+ verwenden, können Sie auf einfache Weise ein Datum ohne Uhrzeit abrufen : Verwenden Sie den Typ java.time.LocalDate anstelle von Datum.

LocalDate now = LocalDate.now();
 System.out.println(now.toString());

Die Ausgabe:

2019-05-30

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html

Amy Doxy
quelle
1
Die Verwendung LocalDateist für die meisten Zwecke eine gute Idee, aber es ist unklar, wie dies mit den Eingaben aus der Frage funktioniert 2008-01-01 13:15:00.
Ole VV