2016-07-25 4 views
-2

Ich habe eine Zeichenfolge "2016-07-21T21: 30: 47.492 + 0000" Ich möchte es in der DB in einer Spalte speichern, die den Datentyp 'TIMESTAMP WITH TIMEZONE' hat. Bitte schlagen Sie die Lösung vor. DieseKonvertieren von Zeichenfolge in 'Zeitstempel mit Zeitzone' in Java

ist das, was ich getan habe:

final SimpleDateFormat mdyFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSX"); 
final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
final Date d1 = mdyFormat.parse(strDate); 
final String mdx = sdf.format(d1); 
+1

Welche Datenbanksoftware verwenden Sie? –

+2

Was hast du bisher versucht? Es hört sich so an, als müsste man die Zeichenkette grundsätzlich analysieren, wahrscheinlich zu einem 'java.util.Date' oder' java.time.Instant', dann zu einem 'java.sql.Timestamp' konvertieren und diesen in einem' PreparedStatement' verwenden. –

+0

Kröte für Oracle –

Antwort

0

Ihr Code ein Problem

String strDate = "2016-07-21T21:30:47.492+0000"; 
     final SimpleDateFormat mdyFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSX"); 
    // include `T` as well 

    final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
    final Date d1; 
      try { 
       d1 = mdyFormat.parse(strDate); 
// to add time zone you can use below line 
// sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
       String mdx = sdf.format(d1); 
       System.out.println(mdx); 
      } catch (ParseException ex) { 

      } 

Ausgabe ohne sdf.setTimeZone(TimeZone.getTimeZone("UTC"))

22-07-2016

Ausgang mit sdf.setTimeZone(TimeZone.getTimeZone("UTC"))

ist mit

21-07-2016

TimeZone.getDefault() wird das Standard-Zeitzone des Systems.

+0

Danke AJ. Dies korrigiert das Datum. Aber ich bekomme immer noch die Ausgabe als 2016-07-21T21: 30: 47.492Z. Außerdem bekomme ich beim Speichern in DB den Fehler 'kein gültiger Monat'. P.S - Auf der DB-Seite ist der Typ TIMESTAMP WITH TIMEZONE –

1

Sie verwenden problematische alte Klassen, die jetzt durch java.time-Klassen ersetzt werden.

Hier ist, wie Sie dem Rat von Jon Skeet in einem Kommentar zu der Frage gegeben folgen.

java.time

Der java.time Rahmen in Java 8 und später gebaut wird. Diese Klassen ersetzen die alten problematischen Datum-Zeit-Klassen wie java.util.Date, .Calendar, & java.text.SimpleDateFormat. Das Team Joda-Time empfiehlt auch die Migration zu java.time.

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

Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 & 7 in ThreeTen-Backport und weiter in ThreeTenABP auf Android angepasst.

OffsetDateTime

Sie können diese Eingabezeichenfolge als OffsetDateTime Objekt analysieren.

OffsetDateTime odt = OffsetDateTime.parse("2016-07-21T21:30:47.492+0000"); 

Wenn Ihre JDBC-Treiber mit JDBC 4.2 oder höher entsprechen, können Sie in der Lage sein, passieren/holen über die PreparedStatement::setObject und ResultSet::getObject Methoden in SQL. Wenn nicht, konvertieren Sie in den alten java.sql-Typ.

Konvertieren erfordert ein Objekt Instant. Eine Instant ist eine grundlegendere Bausteinklasse in java.time, der die Flexibilität einer OffsetDateTime fehlt. Die Klasse Instant repräsentiert einen Moment auf der Timeline in UTC mit einer Auflösung von bis zu Nanosekunden. Extrahieren Sie einen Instant von diesem OffsetDateTime.

Instant instant = odt.toInstant(); 

Pass die Instant auf ein neues Verfahren zur alten java.sql Klasse hinzugefügt.

java.sql.Timestamp ts = java.sql.Timestamp.from(instant); 

Dann rufen Sie die PreparedStatement::setTimestamp und ResultSet::getTimestamp Methoden.

myPreparedStatement.setTimestamp(1 , ts); 
… 
java.sql.Timestamp ts = myResultSet.getTimestamp(1); 

Nach einem java.sql.Timestamp holen, konvertiert sofort zu einem java.time Klasse, Instant. Verwenden Sie die java.sql-Klassen nur dort, wo die direkte Unterstützung für java.time-Typen in Ihrem JDBC-Treiber fehlt, und minimieren Sie selbst dann die Verwendung der java.sql-Klassen. Funktioniert Ihre Geschäftslogik in java.time?

Instant instant = ts.toInstant(); 

Verwirrende Klassennamen

Verwechseln Sie nicht die beiden alten Date Klassen mit Java gebündelt. Die java.util.Date repräsentiert ein Datum und eine Uhrzeit. Ein java.sql.Date ist nur ein Datum Wert nur ohne Zeit-of-Tag darstellt (aber eine Time-of-Tag tatsächlich hat verwirrend weil es ein ungeschickter Hack von einem ungeschickten Klasse Design ist).

Vermeiden Sie die Klassen java.util.Date und java.util.Calendar und java.text.SimpleDateFormat vollständig. Und minimieren Sie Ihre Nutzung der java.sql.Date/.Time/.Timestamp Klassen wie oben erörtert.

+0

Ihre Antwort hat mich gerettet !! –

+0

@GauravKhare Gut, ich bin froh. Datum-Uhrzeit-Handhabung ist knifflige Arbeit. Sie können mehr lernen, indem Sie mehr Fragen und Antworten zu Stack Overflow lesen. Suchen Sie insbesondere nach Antworten von [Jon Skeet] (https://stackoverflow.com/users/22656/jon-skeet) und nach Antworten, in denen java.time erwähnt wird. –

+0

Vielen Dank für diese Beiträge, und Sie sind richtig Datum Umgang ist wirklich sehr schwierig für mich zumindest. –