Konvertieren einer Datumszeichenfolge in ein DateTime-Objekt mithilfe der Joda Time-Bibliothek


246

Ich habe ein Datum als Zeichenfolge im folgenden Format "04/02/2011 20:27:05". Ich verwende die Joda-Time-Bibliothek und möchte sie in ein DateTimeObjekt konvertieren . Ich tat:

DateTime dt = new DateTime("04/02/2011 20:27:05")

Aber ich bekomme folgenden Fehler:

Invalid format: "04/02/2011 14:42:17" is malformed at "/02/2011 14:42:17"

Wie konvertiere ich das obige Datum in ein DateTimeObjekt?


2
Wenn Sie hier ankommen und suchen, wie Sie Datumsstrings mit dem java.timePaket in Java 8 analysieren können , versuchen Sie es mit LocalDateTime.parseoder Instant.parse.
Heenenee

1
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

Antworten:


477

Verwendung DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);

2
Hallo, ist es möglich, dass der Formatierer keine Zeitzonen akzeptiert? "zz" gibt "MEZ" zurück, wenn die toStringFunktion angewendet wird, aber ich kann nicht daraus analysieren : Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". Ist das ein bekanntes Problem? Wie kann ich das vermeiden? Grüße.
Danyel

2
@Danyel: Sie können Zeitzonen wie diese hinzufügen DateTimeFormat.forPattern ("JJJJ-MM-TT'T'HH: mm: ss.SSS'Z '") .withLocale (Locale.ROOT) .withChronology (ISOChronology.getInstanceUTC ()) ;;
Hyque

2
Ich erhalte ein ungültiges Format: "2014-11-04T17: 41: 52.000 + 01: 00" ist bei "+01: 00" mit dem folgenden Formatierer fehlerhaft: private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern ("yyyy-MM- dd'T'HH: mm: ss.SSS'ZZ '"); DATE_TIME_FORMATTER.parseDateTime ((String) customSoftware.get (Header [3])) auf joda-time 2.2
Stephane

2
Nachdem die einfachen Anführungszeichen um das ZZ entfernt wurden, funktionierte es. Ich frage mich, was diese einfachen Anführungszeichen bedeuten ...
Stephane

2
@StephaneEybert (oder sonst jemand) Die einfachen Anführungszeichen bedeuten, dass etwas ein in der Zeichenfolge zu erwartendes Literalzeichen ist und nicht als Teil des Musters betrachtet werden darf. Beispiel: Wenn Ihr Datum aus irgendeinem Grund als "2015-08-dd30" eingeht, geben Sie "yyyy-MM-'dd'dd" an und geben an, dass das erste dd ein in der Zeichenfolge erwarteter Literalteil ist Der zweite dd (außerhalb der Apostrophe) ist der tatsächliche Tag, der analysiert werden muss. In Ihrem früheren Fall hätte es also funktioniert, wenn Sie anstelle der tatsächlichen Zeitzone "ZZ" am Ende Ihrer eingehenden datetime-Zeichenfolge gesetzt hätten.
SadBunny

62

Ich weiß, dass dies eine alte Frage ist, aber ich wollte hinzufügen, dass Sie dies ab JodaTime 2.0 mit einem Einzeiler tun können:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));

3
Was soll ich in den Importbereich einfügen?
Dmitry

20
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

7
Sollte sein: DateTimeFormat.forPattern ("TT / MM / JJJJ HH: MM: SS"). ParseDateTime ("04/02/2011 20:27:05")
Sufinawaz

16

Aus Kommentaren habe ich eine Antwort wie ausgewählt und auch TimeZone hinzugefügt:

String dateTime = "2015-07-18T13:32:56.971-0400";

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        .withLocale(Locale.ROOT)
        .withChronology(ISOChronology.getInstanceUTC());

DateTime dt = formatter.parseDateTime(dateTime);

13

Ihr Format entspricht nicht dem erwarteten ISO-Format. Versuchen Sie es

DateTimeFormatter format = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime time = format.parseDateTime("04/02/2011 20:27:05");

5

Sie können auch SimpleDateFormat wie in verwendenDateTimeFormat

Date startDate = null;
Date endDate = null;
try {
    if (validDateStart!= null) startDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateStart + " " + validDateStartTime);
    if (validDateEnd!= null) endDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateEnd + " " + validDateEndTime);
} catch (ParseException e) {
    e.printStackTrace();
}

3
kirlisakal tut dies in diesem Fall nicht, aber erstellen Sie keine gemeinsam genutzte Instanz eines SimpleDateFormat, da es nicht threadsicher ist. Es ist ein Albtraum, wenn Sie dies tun
dannrob

2
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle . Und die java.time-Klassen sind im Gegensatz zu den Legacy-Klassen threadsicher.
Basil Bourque

3

Sie benötigen einen DateTimeFormatter , der dem von Ihnen verwendeten Format entspricht. In den Dokumenten finden Sie Anweisungen zum Erstellen eines Dokuments.

Aus der Manschette, ich denke du brauchst format = DateTimeFormat.forPattern("M/d/y H:m:s")


3

tl; dr

java.time.LocalDateTime.parse( 
    "04/02/2011 20:27:05" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
)

java.time

Der moderne Ansatz verwendet die Klassen java.time, die die ehrwürdige Joda-Zeit ersetzen Projekt .

Bei der Analyse als LocalDateTimeEingabe fehlt jede Anzeige für die Zeitzone oder den Versatz von UTC.

String input = "04/02/2011 20:27:05" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString (): 2011-02-04T20: 27: 05

Tipp: Verwenden Sie nach Möglichkeit die Norm ISO 8601 , wenn Sie Datums- und Uhrzeitwerte als Text anstelle des hier Formats austauschen. Praktischerweise verwenden die java.time-Klassen die Standardformate beim Parsen / Generieren von Zeichenfolgen.


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


2

Eine einfache Methode:

public static DateTime transfStringToDateTime(String dateParam, Session session) throws NotesException {
    DateTime dateRetour;
    dateRetour = session.createDateTime(dateParam);                 

    return dateRetour;
}

0

Es gibt zwei Möglichkeiten , dies könnte erreicht .

DateTimeFormat

DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

SimpleDateFormat

        String dateValue = "04/02/2011 20:27:05";
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); //  04/02/2011 20:27:05

        Date date = sdf.parse(dateValue); // returns date object
        System.out.println(date); // outputs: Fri Feb 04 20:27:05 IST 2011

Beide therm veraltet. Es gibt auch einen modernen Weg; es ist in der Antwort von Basil Bourque . Außerdem tragen Sie nichts bei, was nicht bereits in mehreren anderen Antworten enthalten ist. Und wenn nach Joda-Time gefragt wird, SimpleDateFormatist es meiner ehrlichsten Meinung nach schlecht , den noch länger veralteten und notorisch lästigen Vorschlag zu machen .
Ole VV
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.