2013-03-31 5 views
31

Ich versuche ein Datum in JJJJ-MM-TT'T'HH zu formatieren: mm: ss.SSSz format bis JJJJ-MM-TT HH: mm: ss, das sollte einfach sein, aber ich kann es nicht zur Arbeit bringen.Java-Format JJJJ-MM-TT'T'HH: mm: SS.SSZ bis JJJJ-MM-TT HH: MM: SS

Ein Datum, das analysiert werden muss, ist in Form von: 2012-10-01T09: 45: 00.000 + 02: 00
Jetzt benutze ich diese einfachen Datumsformatierer zu formatieren:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.FRANCE); 

Dennoch ergibt dies eine Ausgabe ähnlich 2012-10-01T09: 45: 00.000UTC + 00: 00.

Ich habe auch versucht, "yyyy-MM-dd'T'HH: mm: ss.SSSZ" als Muster und "JJJJ-MM-ddHH: mm: ss" zu verwenden. Letzterer gibt ein Datum in der Form 2012-10-01T09: 45: 00 zurück, aber noch nicht dort.

Ich dachte, substring das T weg wäre ein bisschen chaotisch und schafft Overhead ohne Grund, was wäre die richtige Art, diese Daten zu formatieren?

ich 2012-10-01T09 konvertieren Zur Veranschaulichung möchte: 45: 00.000 + 02: 00 in 2012-10-01 09.45.00

Prost!

+0

Substringing ist viel schneller/einfacher als die Konvertierung zu/von einem Datumsobjekt Verwendung in Java sein kann. Sie zerlegen das Original in zwei Teilstrings (fixed offsets) und verketten es dann mit einem Leerzeichen dazwischen. –

+0

Warum ist das? Ich könnte bis zu 100 Daten in einem einzigen Durchgang analysieren. – Gooey

+0

Sie glauben nicht, dass zwei Teilstring-Operationen mit fest codierten Offsets plus ein paar Verkettungsoperationen schneller wären als das Erstellen und Ausführen von zwei Datumsformatierern? –

Antwort

57
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date d = sdf.parse(time); 
String formattedTime = output.format(d); 

Dies funktioniert. Sie müssen zwei SimpleDateFormats verwenden, eines für die Eingabe und eines für die Ausgabe, aber es gibt Ihnen genau das, was Sie wollen.

+0

Es hängt 12 am Start ... Ich erwarte Datum 02/05/2017, aber es gibt mir 122/05/2017 – VVB

6

Gooye wenn es möglich ist Joda Zeit in Ihrem Projekt zu verwenden, dann funktioniert dieser Code für mich:

String dateStr = "2012-10-01T09:45:00.000+02:00"; 
String customFormat = "yyyy-MM-dd HH:mm:ss"; 

DateTimeFormatter dtf = ISODateTimeFormat.dateTime(); 
LocalDateTime parsedDate = dtf.parseLocalDateTime(dateStr); 

String dateWithCustomFormat = parsedDate.toString(DateTimeFormat.forPattern(customFormat)); 
System.out.println(dateWithCustomFormat); 
+2

Hinzufügen zu mehr Abhängigkeit für nichts. Es existiert im JDK, siehe Chris Tate Antwort – Aubin

+0

Ich denke, es wird in Java 8 funktionieren, nicht für Java 7 oder darunter. –

+0

@Sam, Es wird in jeder Java-Version arbeiten, weil es joda-Zeit-Bibliothek verwendet. Importieren Sie es einfach in Ihr Projekt und importieren Sie benötigte Abhängigkeiten. – moleksyuk

1

Wenn Sie wirklich müssen schnell sein (nicht, dass ich glaube, Sie tun):

char[] chars = sourceDate.toCharArray(); 
chars[10] = ' '; 
String targetDate = new String(chars, 0, 19); 
1

Ich habe versucht, das Datum Zeichenfolge aus einer JSON Antwort empfangen zu formatieren z.B. 2016-03-09T04: 50: 00-0800 bis JJJJ-MM-TT. Also hier ist, was ich versucht habe und es hat funktioniert und mir geholfen, die formatierte Datumszeichenkette ein Kalenderwidget zuzuweisen.

String DATE_FORMAT_I = "yyyy-MM-dd'T'HH:mm:ss"; 
String DATE_FORMAT_O = "yyyy-MM-dd"; 


SimpleDateFormat formatInput = new SimpleDateFormat(DATE_FORMAT_I); 
SimpleDateFormat formatOutput = new SimpleDateFormat(DATE_FORMAT_O); 

Date date = formatInput.parse(member.getString("date")); 
String dateString = formatOutput.format(date); 

Dies funktionierte. Vielen Dank.

+0

Diese Antwort befasst sich nicht mit den Besonderheiten der Frage. Und es kopiert die Ideen der [3-jährigen akzeptierten Antwort] (http://stackoverflow.com/a/15730771/642706). Daher sehe ich keinen Wert hinzugefügt werden. Schön zu sehen, dass Sie an Stack Overflow teilnehmen möchten. Aber deine Antworten müssen die Spezifika der Frage adressieren und kein Duplikat sein. –

4

java.time

Wir haben neue Technologie für dieses Problem: Rahmen java.time in Java gebaut 8 und höher.

Ihre Eingabezeichenfolge entspricht dem Standard ISO 8601-Format. Dieser Standard wird standardmäßig in den java.time-Klassen zum Parsen/Erzeugen von textuellen Darstellungen von Datum-Uhrzeit-Werten verwendet.

OffsetDateTime odt = OffsetDateTime.parse("2012-10-01T09:45:00.000+02:00"); 

Ihre Frage schlägt vor, dass Sie auf eine ganze Sekunde abschneiden möchten.

OffsetDateTime odtTruncatedToWholeSecond = odt.truncatedTo(ChronoUnit.SECONDS); 

Es scheint, Sie möchten die Offset- und Zeitzoneninfo weglassen. Der vordefinierte Formatierer DateTimeFormatter.ISO_LOCAL_DATE_TIME macht das.

Und anscheinend möchten Sie ein Leerzeichen in der Mitte anstelle des Standards T verwenden. Sie könnten dafür einen eigenen Formatierer definieren, aber ich würde einfach eine Zeichenfolgenmanipulation durchführen, um die T durch einen SPACE zu ersetzen.

String output = odtTruncatedToWholeSecond.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace("T" , " "); 

einfach String Manipulations

Da die Kommentare zu der Frage vorschlagen, streng genommen Sie Ihr Ziel durch die Arbeit nur mit Streichern erreichen können und nicht auf irgendwelche Datum Zeitobjekte konvertieren. Aber ich gebe diese Antwort hier, vorausgesetzt, Sie haben möglicherweise andere Geschäftslogik, um mit diesen Datum-Zeit-Werten zu arbeiten.


Über java.time

Der java.time Rahmen in Java 8 gebaut und später. Diese Klassen ersetzen die problematischen alten legacy Datum-Uhrzeit-Klassen wie java.util.Date, Calendar, & SimpleDateFormat.

Das Projekt Joda-Time, jetzt in maintenance mode, rät zur Migration auf die Klassen java.time.

Weitere Informationen finden Sie unter Oracle Tutorial. Und suchen Sie nach Stack Overflow für viele Beispiele und Erklärungen. Spezifikation ist JSR 310.

Sie können java.time Objekte direkt mit Ihrer Datenbank austauschen. Verwenden Sie eine JDBC driver konform mit JDBC 4.2 oder höher. Keine Notwendigkeit für Strings, keine Notwendigkeit für java.sql.* Klassen.

Wo erhalten Sie die Klassen java.time?

  • Java SE 8, Java SE 9 und später
    • Built-in.
    • Teil der Standard-Java-API mit einer gebündelten Implementierung.
    • Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
  • Java SE 6 und Java SE 7
    • Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 & 7 in ThreeTen-Backport.
  • Android
    • Spätere Versionen von Android-Bundle Implementierungen der java.time Klassen.
    • Für frühere Android, das ThreeTenABP Projekt passt ThreeTen-Backport (oben erwähnt). Siehe How to use ThreeTenABP….

Das ThreeTen-Extra Projekt erstreckt java.time mit zusätzlichen Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von java.time. Hier finden Sie einige nützliche Klassen wie Interval, , YearQuarter und more.

+0

nur für Java 8 oder höher –

+1

@Sangram Eigentlich nein, nicht nur Java 8. Ein großer Teil der java.time-Funktionalität wird im [ThreeTen-Backport] (http: // www.) In Java 6 und Java 7 zurück portiert. (http://www.dreiten.org/threetenbp/) Projekt und weiter angepasst an Android im [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP) Projekt. –

0
String dateStr = "2016-09-17T08:14:03+00:00"; 
String s = dateStr.replace("Z", "+00:00"); 
s = s.substring(0, 22) + s.substring(23); 
Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s); 
Timestamp createdOn = new Timestamp(date.getTime()); 
mcList.setCreated_on(createdOn); 

Java 7 Unterstützung für Zeitzone Deskriptoren gemäß ISO 8601. Diese 7.