2016-08-06 8 views
3

Server-Side-Code (Server-Zeitzone ist UTC): -Converting java.util.Date zu java.sql.Timestamp führt zu falschem Wert

Date aDate = new Date(); 
java.sql.Timestamp aTimestamp = new java.sql.Timestamp(aDate.getTime()); 

Client-Seite (Mobil-App, Zeitzone GMT +5: 30) : -

Hitting a service request which runs above code on server side 

Das Problem ist, wenn ich auf dem Server debuggt, folgende Werte gefunden: -

aDate.getTime() prints to -> 1470472883877 milliseconds i.e., Sat Aug 06 2016 14:11:23 GMT+0530 

aber

aTimestamp prints to -> (java.sql.Timestamp) 2016-08-06 08:41:44.109 

Es ist irgendwie komisch, ich habe keine Ahnung, was in der Konvertierung ist !! Bitte helfen Sie

+0

Können Sie bitte den Druck Code posten? – johnnyaug

+0

'System.out.println (aDate.getTime())' und 'System.out.println (aTimestamp)' @johnnyaug – abhinavroy23

Antwort

0

UTC und GMT sind Formate.
java.util.Date und java.sql.Timestamp sind unabhängig von der Zeitzone. Sie speichern eine long time in ms für die Darstellung ihres inneren Zustandes. Für Informationen ist der Kalender zeitzonenabhängig.

Mit Datum oder Zeitstempel, um GMT oder UTC-Format in einer Ausgabe zu unterscheiden, müssen Sie einen Formatierer verwenden, der das Datum in Zeichenfolge ausgibt, indem die Zeitzone berücksichtigt wird.

In Ihrer Ausgabe: 2016-08-06 08:41:44.109 verwenden Sie keinen Formatierer, der die Zeitzone kennt. Es ist wahrscheinlich das Ergebnis einer toString() auf der java.sql.Timestamp Instanz oder etwas Ähnliches.

Was Sie als Konvertierung betrachten, ist keine Konvertierung, sondern eine Formatierung, da der Zeitstempel zwischen den beiden Objekten gleich bleibt.

Wenn Sie im UTC-Format angezeigt werden sollen, verwenden Sie den entsprechenden formater mit einem Simple zum Beispiel:

SimpleDateFormat dt= new SimpleDateFormat("MM/dd/yyyy hh:mm:ss z"); 
dt.setTimeZone(TimeZone.getTimeZone("UTC")); 
String dateStringInUTC = dt.format(new Date(yourSqlTimestamp.getTime())); 
+0

Ja, Sie haben Recht "DateFormat" und "SimpleDateFormat" sind bewusst, Zeitzonen, aber beide Sie geben einen ** String-Wert ** des Datums zurück. Aber ich möchte die Ausgabe als "date" – abhinavroy23

+0

Eine Lösung ist, die Zeichenfolge zu analysieren mit Datum dateFormat.parse (strDate) alt, aber ich möchte es nicht verwenden, da es die Wahrscheinlichkeit von 'java.text.ParseException erhöht : Untrennbares Datum' – abhinavroy23

+0

Ich verstehe nicht, was Sie mit "Ich will die Ausgabe als Datum" bedeuten. Eine Ausgabe sollte eine Zeichenfolge sein, nein? Wenn du ein Date-Objekt mit dem guten Timestamp haben willst, hast du es schon seither wie erklärt, was du eine Conversion nennst, ist keine Konvertierung sondern eine Formatierung. – davidxxx

0

Das folgende ist wahrscheinlich das, was Sie suchen:

Calendar cal = Calendar.getInstance(Locale.GERMANY); // use your locale here 
Timestamp aTimestamp = new Timestamp(cal.getTimeInMillis()); 
System.out.println(aTimestamp); 
System.out.println(cal.getTime()); 

Und die Ausgabe:

2016-08-06 19: 12: 54.613

Sa 6. August 19.12.54 CEST 2016