484 Stimmen

Wie kann ich Daten mit LocalDateTime analysieren/formatieren? (Java 8)

Java 8 hat eine neue java.time-API zur Arbeit mit Datum und Zeit hinzugefügt (JSR 310).

Ich habe Datum und Uhrzeit als String (z. B. "2014-04-08 12:30"). Wie kann ich eine LocalDateTime-Instanz aus dem gegebenen String erhalten?

Nachdem ich mit dem LocalDateTime-Objekt fertig bin: Wie kann ich dann die LocalDateTime-Instanz wieder in einen String mit dem gleichen Format wie oben gezeigt konvertieren?

4voto

msangel Punkte 9340

Alle Antworten sind gut. Die Java 8+ Versionen haben diese Muster für das Parsen und Formatieren von Zeitzonen: V, z, O, X, x, Z.

Hier sind sie, zum Parsen, gemäß den Regeln aus der Dokumentation:

   Symbol  Bedeutung                     Darstellung      Beispiele
   ------  -------                     ------------      -------
   V       Zeitzone-ID                zone-id           America/Los_Angeles; Z; -08:30
   z       Zeitzonename              zone-name         Pacific Standard Time; PST
   O       lokalisierte Zeitzonen-Abweichung       offset-O          GMT+8; GMT+08:00; UTC-08:00;
   X       Zeitzonen-Abweichung 'Z' für null    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
   x       Zeitzonen-Abweichung                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
   Z       Zeitzonen-Abweichung                 offset-Z          +0000; -0800; -08:00;

Aber wie sieht es beim Formatieren aus?

Hier ist ein Beispiel für ein Datum (unter der Annahme einer ZonedDateTime), das zeigt, wie sich diese Muster für unterschiedliche Formatierungsmuster verhalten:

// Die Hilfsfunktion:
static void printInPattern(ZonedDateTime dt, String pattern) {
    System.out.println(pattern + ": " + dt.format(DateTimeFormatter.ofPattern(pattern)));
}

// Das Datum:
String strDate = "2020-11-03 16:40:44 America/Los_Angeles";
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss zzzz");
ZonedDateTime dt = ZonedDateTime.parse(strDate, format);
// 2020-11-03T16:40:44-08:00[America/Los_Angeles]

// Regeln:
// printInPattern(dt, "V");     // Ausnahme!
printInPattern(dt, "VV");       // America/Los_Angeles
// printInPattern(dt, "VVV");   // Ausnahme!
// printInPattern(dt, "VVVV");  // Ausnahme!
printInPattern(dt, "z");        // PST
printInPattern(dt, "zz");       // PST
printInPattern(dt, "zzz");      // PST
printInPattern(dt, "zzzz");     // Pacific Standard Time
printInPattern(dt, "O");        // GMT-8
// printInPattern(dt, "OO");    // Ausnahme!
// printInPattern(dt, "OO0");   // Ausnahme!
printInPattern(dt, "OOOO");     // GMT-08:00
printInPattern(dt, "X");        // -08
printInPattern(dt, "XX");       // -0800
printInPattern(dt, "XXX");      // -08:00
printInPattern(dt, "XXXX");     // -0800
printInPattern(dt, "XXXXX");    // -08:00
printInPattern(dt, "x");        // -08
printInPattern(dt, "xx");       // -0800
printInPattern(dt, "xxx");      // -08:00
printInPattern(dt, "xxxx");     // -0800
printInPattern(dt, "xxxxx");    // -08:00
printInPattern(dt, "Z");        // -0800
printInPattern(dt, "ZZ");       // -0800
printInPattern(dt, "ZZZ");      // -0800
printInPattern(dt, "ZZZZ");     // GMT-08:00
printInPattern(dt, "ZZZZZ");    // -08:00

Im Falle eines positiven Versatzes wird das Zeichen + überall verwendet (wo jetzt ein - steht) und nie weggelassen.

Dies funktioniert gut für die neuen Typen von java.time. Wenn Sie diese für java.util.Date oder java.util.Calendar verwenden möchten - nicht alles wird funktionieren, da diese Typen fehlerhaft sind (und daher als veraltet gekennzeichnet sind, bitte verwenden Sie sie nicht).

3voto

Tomasz Punkte 477

Die universelle Methode sieht wie folgt aus. Es funktioniert für:

  • yyyy-MM-dd HH:mm:ss.SSS

  • yyyy-MM-dd HH:mm:ss.S

  • yyyy-MM-dd HH:mm:ss

  • yyyy-MM-dd HH:mm

  • yyyy-MM-dd HH

  • yyyy-MM-dd

    public static final String DATE_FORMAT_YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
    
    public LocalDateTime stringToLocalDateTime(String s){
        return LocalDateTime.parse(s, DateTimeFormatter.ofPattern(DATE_FORMAT_YYYY_MM_DD_HH_MM_SS_SSS.substring(0, s.length())));
    }

2voto

mrsrinivas Punkte 30892

Lass uns zwei Fragen stellen, Beispiel-String "2014-04-08 12:30"

Wie kann ich eine LocalDateTime-Instanz aus dem angegebenen String erhalten?

import java.time.format.DateTimeFormatter
import java.time.LocalDateTime

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")

// Parsen oder Konvertieren
final LocalDateTime dt = LocalDateTime.parse("2014-04-08 12:30", formatter)

dt sollte es dir ermöglichen, alle datums- und zeitbezogenen Operationen durchzuführen

Wie kann ich dann die LocalDateTime-Instanz wieder in einen String mit dem gleichen Format konvertieren?

final String date = dt.format(formatter)

0voto

flowgrad Punkte 461

Ich fand es wunderbar, mehrere Varianten von Datum-Zeit-Formaten wie diese abzudecken:

final DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
dtfb.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"))
    .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"))
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
    .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0);

0voto

Arvind Kumar Avinash Punkte 62339

Es gibt bereits viele gute Antworten auf diese Frage. Diese Antwort zeigt, wie Sie vordefinierte DateTimeFormatters verwenden können, um einen DateTimeFormatter zu erstellen, der den angegebenen Datum-Zeit-String parsen kann.

Das Formatieren des erhaltenen LocalDateTime mit diesem DateTimeFormatter gibt jedoch einen String mit der Zeit im Format HH:mm:ss zurück. Um den Zeit-String auf das Format HH:mm zu beschränken, müssen wir immer noch das Muster uuuu-MM-dd HH:mm verwenden, wie es andere Antworten bereits getan haben.

Demo:

class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                .append(DateTimeFormatter.ISO_LOCAL_DATE)
                .appendLiteral(' ')
                .append(DateTimeFormatter.ISO_LOCAL_TIME)
                .toFormatter(Locale.ENGLISH);

        String strDateTime = "2014-04-08 12:30";
        LocalDateTime ldt = LocalDateTime.parse(strDateTime, dtf);
        System.out.println(ldt);

        // Das Formatieren des erhaltenen LocalDateTime unter Verwendung dieses DateTimeFormatter
        // gibt einen String mit der Zeit im HH:mm:ss-Format zurück. Um die Zeit
        // auf HH:mm-Format zu beschränken, müssen wir weiterhin das Muster, uuuu-MM-dd HH:mm, wie in
        // anderen Antworten verwendet, verwenden.
        String strDateTimeFormatted = ldt.format(dtf);
        System.out.println(strDateTimeFormatted);

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm", Locale.ENGLISH);
        strDateTimeFormatted = ldt.format(formatter);
        System.out.println(strDateTimeFormatted);
    }
}

Output:

2014-04-08T12:30
2014-04-08 12:30:00
2014-04-08 12:30

ONLINE DEMO

Hinweis: Hier können Sie y anstelle von u verwenden, aber ich bevorzuge u gegenüber y.

Erfahren Sie mehr über die moderne Date-Time-API unter Leitfaden: Datum und Zeit.

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