2016-07-05 26 views
0

So versuche ich eine Zeichenfolge in ein ISO-Format für das Datum zu konvertieren. Dies ist die Zeichenfolge, die ich versuche zu konvertieren "2016-07-05 02: 14: 35.0" Ich möchte es in diesem Format der iso 8601 "2016-07-05T02: 14: 35.0"Konvertieren Sie eine Zeichenfolge in ISO-Datumsformat

haben

ich habe diese so weit

DateTimeFormatter format = DateTimeFormat.forPattern("YYYY-MM-DDTHH:mm:sszzz"); 
    new LocalDate(); 
    LocalDate newDate = LocalDate.parse(created,format); 
    created = newDate.toString(); 

Aber es ist mir diese Ausnahme geben

ERROR: Illegal pattern component: T; nested exception is java.lang.IllegalArgumentException: Illegal pattern component: T 

ich die Beispiele gefolgt, und ich weiß nicht, was ich hier falsch mache. Jede Hilfe wäre willkommen.

+0

Siehe auch: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT. Wenn das nicht hilft, ändern Sie das Muster in 'YYYY-MM-DD'THH: mm: sszzz' – shachar

+0

Überlegen Sie das Problem? '" 2016-07-05 02: 14: 35.0 ".replace (" "," T ")' –

Antwort

4

Zum einen ist dieser Wert ein LocalDateTime, nicht ein LocalDate. Wenn Sie am Ende ein Datum bekommen möchten, würde ich es zuerst in ein LocalDateTime umwandeln, dann nehmen Sie den Datumsteil davon.

Lesen Sie die Dokumentation bei der Formatierung und Analyse des Datums immer sorgfältig durch.. Es sieht so aus, als ob Sie Joda Time verwenden (aufgrund der Verwendung von forPattern; wenn Sie zu Java 8 wechseln können, wäre das vorteilhaft). Das bedeutet, dass Sie die DateTimeFormat docs lesen sollten.

Aktuelle Probleme mit Ihrem Muster:

  • Sie mit 'D' anstelle von 'd'; das bedeutet, Tag-of-Jahres-
  • Du hast ‚T‘ angegeben, ohne sie zu zitieren, und es ist nicht in dem Muster ohnehin
  • Sie den Anteil-of-zweiten Teil Ihres Wertes ignoriert hat
  • Sie haben 'zz' angegeben, wenn in dem Wert kein Zeitzonenindikator vorhanden ist.

Hier ist ein funktionierendes Beispiel:

import org.joda.time.*; 
import org.joda.time.format.*; 

public class Test { 
    public static void main(String[] args) { 
     String text = "2016-07-05 02:14:35.0"; 
     DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.S"); 
     LocalDateTime localDateTime = LocalDateTime.parse(text, format); 
     System.out.println(localDateTime); 
    } 
} 

Wenn Sie tatsächlich Werte analysieren wollen mit T in der Mitte, dann würden Sie ein Muster von "yyyy-MM-dd'T'HH:mm:ss.S" verwenden - beachten Sie, wie dann die T so zitiert Es wird buchstäblich als Formatbezeichner behandelt.

Beachten Sie, dass dies nur Parsing ist. Es ist nicht "eine Zeichenfolge in ISO-Datumsformat konvertieren" - es wandelt eine Zeichenfolge in eine LocalDateTime. Wenn Sie dann Format diesen Wert in einem ISO-Format möchten, müssen Sie DateTimeFormatter.print mit einem geeigneten Format verwenden.Zum Beispiel möchten Sie vielleicht in ein Format von yyyy-MM-dd'T'HH:mm:ss.S ‚konvertieren:

import org.joda.time.*; 
import org.joda.time.format.*; 

public class Test { 
    public static void main(String[] args) { 
     String text = "2016-07-05 02:14:35.0"; 
     DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.S"); 
     LocalDateTime localDateTime = LocalDateTime.parse(text, parser); 
     DateTimeFormatter printer = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.S"); 
     String formatted = printer.print(localDateTime); 
     System.out.println(formatted); // Output 2016-07-05T02:14:35.0 
    } 
} 

Der obige Code nur eine einzelne Ziffer Bruch-of-Sekunden behandelt. Sie könnten mit .SSS anstelle von .S analysieren, aber Sie müssen wirklich herausfinden, was die Ausgabe in verschiedenen Fällen sein soll (z. B. für 100 Millisekunden, wollen Sie .1 oder .100?).

+0

Aber der Wert, den ich will, hat kein T drin. Ich dachte, dass es eine Möglichkeit gibt, das T automatisch einzusetzen. – MNM

+0

@MNM: Aber der Wert, den Sie * analysieren * nicht. Sie haben uns nicht gezeigt, welches Ergebnis Sie wollen. Wenn Sie in ein anderes Format konvertieren müssen, benötigen Sie zwei verschiedene Formatierer. Es würde helfen, wenn Sie die erwartete Ausgabe liefern würden ... –

+0

Ich möchte das ISO-Format so wie dieses JJJJ MM TT T HH mm ss Das T ist, was ich da reinsetzen möchte. Ich möchte nicht die ursprüngliche Zeichenfolge auseinander brechen und fügen Sie dann ein T in und dann concat all das zusammen – MNM

-3

das folgende Format verwenden zu konvertieren

 String format = "yyyy-mm-dd hh:mm:ss" 

Sie sind das falsche Format zu konvertieren. Mit T wird nur das Datum von der Zeit getrennt. das Format verwenden wie dies

 String = "yyyy-MM-dd'T'HH:mm:ss" 
+1

Das ist auch das falsche Format. –

+0

"yyyy-MM-dd'T'HH: mm: ss" benutze dies –

+1

Das ist * immer noch * falsch - es enthält nicht den Bruchteil einer Sekunde, das erste Muster, das du zeigst, benutzt noch Minuten anstelle von Monaten und 12-Stunden-Stunden, und das zweite Snippet, das Sie präsentieren, würde nicht einmal kompilieren. –

1

Sie haben einige Fehler im Code:

  • Das Muster ': mm: ss.SSS yyyy-MM-dd HH' sein sollte. Achten Sie auf
    und Kleinbuchstaben.
  • Verwenden Sie LocalDateTime, um Datum und Uhrzeit abzurufen. LocalDate enthält nur das Datum.

Der korrigierte Code:

String created = "2016-07-05 02:14:35.000"; 
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); 
LocalDateTime newDate = LocalDateTime.parse(created,format); 
created = newDate.toString(); 
System.out.println(created);