135 Stimmen

Java Date Informationen zur Sperrzeit

Ich habe ein Java-Date-Objekt, das Datums- und Zeitinformationen enthält. Ich möchte eine Methode schreiben, die die Zeitinformationen abschneidet und die Stunden-Minuten-Sekunden abkürzt, so dass nur noch das Datum übrig bleibt.

Beispiel Eingabe:

2008-01-01 13:15:00

Erwartetes Ergebnis:

2008-01-01 00:00:00

Haben Sie einen Tipp? Ich habe versucht, etwas Ähnliches zu tun:

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

aber ich bin auf Probleme mit der Zeitzone gestoßen.

22voto

h7r Punkte 4674

Mit Joda können Sie den voraussichtlichen Termin leicht ermitteln.

Ab Version 2.7 (vielleicht seit einer früheren Version als 2.2), wie ein Kommentator anmerkt, toDateMidnight wurde zu Gunsten des treffend benannten withTimeAtStartOfDay() , wodurch die praktische

DateTime.now().withTimeAtStartOfDay()

möglich.

Zusätzlicher Vorteil: eine viel schönere API.

Bei älteren Versionen können Sie Folgendes tun

new DateTime(new Date()).toDateMidnight().toDate()

6 Stimmen

Die mitternachtsbezogenen Methoden und Klassen in Joda-Time sind nun veraltet. Die Entwickler empfehlen, sie nicht mehr zu verwenden. Verwenden Sie stattdessen die Methode withTimeAtStartOfDay .

0 Stimmen

Vielen Dank für den Hinweis. Ich habe die Antwort aktualisiert, um dies zu berücksichtigen.

0 Stimmen

Sie können auch Folgendes verwenden toLocalDate um ein Objekt zu erhalten, das nicht einmal eine Zeitkomponente hat.

12voto

Sergio Kosik Punkte 193

Ich habe die Trunkierung mit der neuen Java8-API durchgeführt. Ich konfrontiert mit einer seltsamen Sache, aber im Allgemeinen ist es truncate...

Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);

0 Stimmen

Stichworte: java.time, Java 8, LocalDateTime.truncatedTo()

2 Stimmen

Diese Antwort liefert nur Daten für den Kontext der UTC-Zeitzone.

8voto

Basil Bourque Punkte 256611

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[Europe/Paris]

Um einen String im gewünschten Format zu erzeugen, übergeben Sie eine 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 aber alte Datum-Zeit-Klassen, die durch das java.time-Framework veraltet sind.

java.time

Das java.time-Framework ist in Java 8 und höher integriert. Ein Großteil der java.time-Funktionalität wurde in Java 6 und 7 zurückportiert ( DreiZehn-Backport ) und weiter angepasst an Android ( DreiZehnABP ).

Ändern Sie zunächst die Eingabezeichenfolge so, dass sie der kanonischen Version des ISO 8601-Formats entspricht. Die Norm ISO 8601 Formate werden standardmäßig in java.time-Klassen zum Parsen/Generieren von Strings verwendet, die Datums-/Zeitwerte darstellen. Wir müssen das SPACE in der Mitte durch ein T .

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

Jetzt können wir es als LocalDateTime wobei "Lokal" keine bestimmte Örtlichkeit bedeutet. Die Eingabe enthält keine Abweichung von der UTC oder Informationen zur Zeitzone.

LocalDateTime ldt = LocalDateTime.parse( input );

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

Wenn Sie sich weder um die Uhrzeit noch um die Zeitzone kümmern, konvertieren Sie in eine LocalDate .

LocalDate ld = ldt.toLocalDate();

ld.toString() 2008-01-01

Erster Moment des Tages

Wenn Sie stattdessen die Tageszeit auf den ersten Moment des Tages setzen wollen, verwenden Sie eine ZonedDateTime Klasse, dann konvertieren in eine LocalDate Objekt, um seine atStartOfDay Methode. Seien Sie sich bewusst, dass der erste Moment vielleicht nicht der richtige ist 00:00:00 wegen der Sommerzeit oder vielleicht wegen anderer Anomalien.

Die Zeitzone ist von entscheidender Bedeutung, da das Datum zu einem bestimmten Zeitpunkt weltweit je nach Zone unterschiedlich ist. So ist zum Beispiel ein paar Augenblicke nach Mitternacht in Paris ein neuer Tag für die Pariser, aber für die Kanadier in Montréal immer noch "gestern".

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[America/Montreal]

UTC

Um diesen Moment durch die Linse des UTC Zeitzone, extrahieren Sie eine Instant Objekt. Sowohl die ZonedDateTime y Instant denselben Zeitpunkt auf der Zeitachse, erscheinen aber als zwei verschiedene Wanduhrzeiten .

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

Instant instant = zdtStartOfDay.toInstant();

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

Wir sehen 5 Uhr morgens und nicht Schlag Mitternacht. Im Standardformat wird die Z am Ende ist die Abkürzung für Zulu und bedeutet "UTC".


Über java.time

El java.time Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Erbe Datum-Zeit-Klassen wie java.util.Date , Calendar , & SimpleDateFormat .

El Joda-Time Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.

Weitere Informationen finden Sie in der Oracle-Tutorial . Auf Stack Overflow finden Sie viele Beispiele und Erklärungen. Spezifikation ist JSR 310 .

Sie können umtauschen java.time Objekte direkt mit Ihrer Datenbank. Verwenden Sie eine JDBC-Treiber übereinstimmend mit JDBC 4.2 oder später. Keine Notwendigkeit für Strings, keine Notwendigkeit für java.sql.* Klassen.

Wo erhält man die java.time-Klassen?

ul>* Java SE 8 , Java SE 9 und später

  • Eingebaut.
  • Teil der Standard-Java-API mit einer gebündelten Implementierung.
  • Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
  • Ein Großteil der java.time-Funktionalität wurde in Java 6 und 7 zurückportiert in DreiZehn-Backport .
  • Spätere Versionen von Android bündeln Implementierungen der java.time-Klassen.
  • Bei älteren Android-Betriebssystemen (<26) ist die DreiZehnABP Projekt passt sich an DreiZehn-Backport (siehe oben). Siehe Wie benutzt man ThreeTenABP .

El DreiZehn-Extra Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt dient als Versuchsfeld für mögliche zukünftige Erweiterungen von java.time. Sie werden hier einige nützliche Klassen finden, wie z.B. Interval , YearWeek , YearQuarter y mehr .

6voto

Verwenden Sie DateUtils von Apache, mit truncate, wie folgt:

DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);

0 Stimmen

Dadurch wird in der lokalen Zeitzone abgeschnitten, nicht in UTC, die Date (getTime) darstellt.

6voto

Gan Quan Punkte 433

Für Zeitstempel:

timestamp -= timestamp % (24 * 60 * 60 * 1000)

3 Stimmen

Es gibt einen kleinen Fehler in diesem Code - die linke Klammer ist nicht richtig platziert, es muss timestamp -= timestamp % (24 * 60 * 60 * 1000) lauten. Dadurch wird der Zeitteil abgeschnitten. Und ich bin mir sicher, dass diese Methode besser ist als das Erstellen eines Caledar-Objekts und das Spielen mit seinen Methoden oder sogar die Verwendung anderer Bibliotheken von Drittanbietern.

2 Stimmen

Nein, das ist NICHT die richtige Lösung, VORSICHT! Dies ist dasselbe wie das Runden des Datumswertes auf die Untergrenze, d.h. Sie erhalten möglicherweise den 28. März für den Zeitstempel des 29. März (in Ihrem Gebietsschema). Daher sind kalenderbasierte Lösungen (Apache's DateUtils verwendet ebenfalls Kalender) die einzige Möglichkeit

0 Stimmen

Dies funktioniert auch nicht, wenn sich die Uhrzeit aufgrund der Sommerzeit ändert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X