LocalDateTime entfernt die Millisekunden

Lesezeit: 4 Minuten

Benutzer-Avatar
Nitin Murlidhar Gaikwad

Ich arbeite an einer Java-Anwendung, in der ich Java 8 verwende.

Ich habe die Datenbank integriert (mehrere Datenbanken Oracle, Mysql, Postgres) und wo in DB ich das Erstellungsdatum string.

Das Datumsformat in DB ist – 2015-07-29 16:23:28.143

Ich hole dies aus der DB und setze es im Localdatetime-Objekt ein

myObj.setCreated(rs.getTimestamp("created").toLocalDateTime());

Hier ist das Problem, dass ich die Millisekunde in der Antwort nicht anzeigen/senden möchte. Ich möchte ein Datum wie 2015-07-29 16:23:28 anzeigen/senden

Ich habe den Formatierer ausprobiert, aber er schlägt fehl, da er eine Zeichenfolge ergibt, und ich möchte das LocalDateTime-Objekt nicht in String ändern, da dies zu größeren Änderungen in allen Java-Anwendungen führen wird. Ich möchte also die Lösung finden

Kann jemand eine Lösung dafür kennen?

  • Nein, das ist nicht das Format in diesen Datenbanken für ihre Date-Time-Datentypen. Datums-/Uhrzeitwerte in der Datenbank haben kein eigenes Format. Die Zeichenfolgendarstellung, die Sie generieren aus Der Datum-Uhrzeit-Wert hat ein Format.

    – Basilikum Bourque

    30. Juli 2015 um 16:35 Uhr

Benutzer-Avatar
Peter Lawrey

Kürzen

Sie können alles in weniger als Sekunden fallen lassen. Anruf LocalDateTime::truncatedTo.

ldt = ldt.truncatedTo(ChronoUnit.SECONDS);

  • @NitinMurlidharGaikwad Kannst du “funktioniert nicht” etwas detaillierter erklären?

    – Peter Lawrey

    14. August 2015 um 10:24 Uhr

  • Wenn Sie dies versuchen, gibt es immer noch die Millisekunde an, aber wenn Sie diesmal eine Zeichenfolge drucken / eingeben, wird die Millisekunde nicht angezeigt

    – Nitin Murlidhar Gaikwad

    20. August 2015 um 4:16 Uhr

  • Diese Antwort hat für mich gut funktioniert, als ich eine LocalDateTime verglichen habe, die in einem Test erstellt und dann zum Vergleich mit einem Wert in der Datenbank verwendet wurde, der die Millisekunden auf die nächste Sekunde rundet.

    – Tim Schimandle

    23. Oktober 2015 um 2:41 Uhr

  • Funktioniert für Instantzu

    – Matt Klein

    25. April 2019 um 16:21 Uhr

  • Das gefällt mir mehr als die ausgewählte Antwort. Die Absicht ist klarer

    – GabrielBB

    14. April 2020 um 6:47 Uhr

Benutzer-Avatar
Marvin

Stellen Sie sie einfach ein 0:

myObj.setCreated(rs.getTimestamp("created").toLocalDateTime().withNano(0));

Probe/Nachweis:

import java.time.LocalDateTime;

public class DateTimeSample {

  public static void main(String[] args) {
    LocalDateTime ldt = LocalDateTime.now();
    System.out.println(ldt);
    System.out.println(ldt.withNano(0));
  }
}

Ausgabe:

2015-07-30T16:29:11.684
2015-07-30T16:29:11

Anmerkung des Autors: Obwohl dies die akzeptierte ist, ist die Antwort von Peter Lawrey IMHO vorzuziehen, da sie die Absicht klarer macht.

  • Diese Lösung funktioniert gut, da sie das Datum ohne die Millisekunden angibt

    – Nitin Murlidhar Gaikwad

    14. August 2015 um 9:42 Uhr

  • Es gibt einen kleinen Hinweis. Stellen Sie sicher, dass Sie keine Sekunden benötigen. Falls Sie 00 Sekunden in Ihrer LocalDateTime 2015-07-30T16:29:00.684 haben und mit Nano(0) oder truncatedTo(ChronoUnit.SECONDS) schneiden, erhalten Sie 2015-07-30T16:29 . Manchmal ist dies nicht das Ergebnis, das Sie erwartet haben.

    – Mike Menko

    5. März 2021 um 19:18 Uhr


  • Gutes Argument. Das ist nur ein Problem mit LocalDateTime.toStringobwohl. LocalDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) druckt die Sekunden.

    – Marwin

    6. März 2021 um 17:59 Uhr


Benutzer-Avatar
Aditya Rewari

Bereitstellung von Code und Protokollen an Happy Family Kommentar unter Marvin Antwort für diejenigen, für die STRING funktioniert,

!!! Ich bin auch in die gleiche Falle getappt!!!

Ausgabe:

withNano(0) und truncatedTo(ChronoUnit.SECONDS) entfernt auch Sekunden, wenn die Sekunden so sind :00 (Bei Uhr, Sekundenzeiger bei 12 geradeaus)

Weiteres Dehnen der Beispielausgabe von Marvin

2015-07-30T16:29:11.684
2015-07-30T16:29:11
2015-07-30T16:31 // for actual time 2015-07-30T16:31:00.684
2015-07-30T16:31 // for actual time 2015-07-30T16:31:00.888

Obiges Verhalten, das BUG verursachen könnte:

Da eliminieren Sie die Nanosekunden, wenn Sekunden als auftauchen :00werden sie nicht gedruckt

AUFLÖSUNG:

public class WithNanoTest {
    public static void main(String[] args) throws InterruptedException {
        while (true) {
            Thread.sleep(500);

            DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
            System.out.println("truncate :::: " + LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS).format(dtf));
            System.out.println("withNano :::: " + LocalDateTime.now().withNano(0).format(dtf));
        }
    }
}

Screenshot von Protokollen

Protokolle mit DateFormatter

Protokolle mit DateFormatter

Protokolliert OHNE DateFormatter (nur mit truncate oder withNano(0))

Beachten Sie hier die fehlenden Sekunden!

Logs OHNE DateFormatter

  • Nun, die Frage war für Ich möchte das LocalDateTime-Objekt nicht in String ändern, da dies zu größeren Änderungen in allen Java-Anwendungen führen wird. Du gibst uns eine Schnur.

    – Ole VV

    27. September 2021 um 11:14 Uhr

  • @OleV.V. Dies ist eher eine Warnung, die ich hier reflektiert habe. Kürzlich konfrontiert dies bei PROD. Also dachte, es ist würdig für diejenigen, für die STRING funktioniert 🙂

    – Aditya Rewari

    27. September 2021 um 11:22 Uhr

  • @OleV.V. Da dieses Abschneiden von Sekunden nicht erwartet wird!

    – Aditya Rewari

    27. September 2021 um 11:24 Uhr

  • @OleV.V. Danke für die Bearbeitung 🙂 . Würde jetzt genaueres Publikum fangen!

    – Aditya Rewari

    28. September 2021 um 6:13 Uhr

  • fwiw: Das Abschneiden entspricht genau dem der Javadoc toString Methode erklärt. Dies ist beabsichtigtes Verhalten. Wenn Sie ein bestimmtes Format haben möchten, verwenden Sie einen Formatierer.

    – Marwin

    6. Dezember 2021 um 11:09 Uhr

Benutzer-Avatar
gdmanandamohon

Dies ist im Wesentlichen ein verdrahteter Fehler, mit dem wir vor kurzem konfrontiert waren. Also zu Konvertierungszwecken ziehe ich es persönlich vor, das Format einzurichten und dann entsprechend mit zu konvertieren DateTimeFormatter

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS").withZone(ZoneOffset.UTC);
myObject.setEventStartTimestamp(dateTimeFormatter.format(eventStartTime));

Wenn Sie die Millisekunden hier nicht benötigen, entfernen Sie sie aus dem Muster. Es liefert genau das Format, das Sie suchen. Auch wenn Sie Ihre Ortszeit einstellen möchten, können Sie Ihre Zeitzone wie wählen ZoneOffset.EST oder ZoneOffset.MT oder ZoneOffset.PST

1226890cookie-checkLocalDateTime entfernt die Millisekunden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy