wake-up-neo.com

Wie sendet man Java.util.Date in Json?

Ich muss Daten in json senden. Wichtig ist, dass ich möchte, dass das Gebietsschema erhalten bleibt, damit der Empfänger das Datum in seiner Ortszeit erhält. Wie kann ich das machen?

Ich kann Date.toString() nicht einfach verwenden, da ich es dann am empfangenden Ende nicht analysieren kann, wenn das Gebietsschema unterschiedlich ist (unterschiedliche Tag- und Monatsnamen usw.).

Gibt es dafür eine Lösung?

8
Greyshack

Verwenden Sie die getTime-Methode von Java.util.Date für den Zeitstempel. Sobald Sie es in ein Datum zurückkonvertieren, kann es jeder Empfänger mit seiner lokalen Zeitzone anzeigen.

Erinnere dich an dieses Datum 

steht für einen bestimmten Zeitpunkt mit einer Millisekundengenauigkeit.

Die toString-Methode formatiert sie nur auf eine spezifische Weise :

dow mon dd hh:mm:ss zzz yyyy

Wenn Sie den Zeitstempel senden möchten, benötigen Sie auch weniger Bandbreite.

3
Laurentiu L.

Eine lange Zeit seit 1970 ist gut, aber nicht für Menschen lesbar und daher eine PITA zum Testen/Entwickeln.

Verwenden Sie daher die ISO 8601 Standard-Datumszeit"yyyy-MM-dd'T'HH:mm:ss" (wobei 'T' nur eine wörtliche T ist (hier wird häufig ein Leerzeichen angezeigt; und Sekundenbruchstellen .SSS).

Zeit zone ist ebenfalls möglich, wird aber hoffentlich nicht benötigt (= in die lokalisierte Zeit integriert).

Vor Java 8 verwenden Sie SimpleDateFormat.

6
Joop Eggen

tl; dr

Instant.now()
       .toString()

2017-01-23T12: 34: 56.123456789Z

Koordinierte Weltzeit

Im Allgemeinen ist es am besten, Daten gegen Datums-/Uhrzeitwerte in UTC (GMT) auszutauschen. Lassen Sie den Empfänger auf eine gewünschte Zeitzone einstellen.

Instant

Die Klasse Instant repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden.

Instant instant = Instant.now() ;
String output = instant.toString() ;  // Generate a String in standard ISO 8601 format.

2017-01-23T12: 34: 56.123456789Z

Sie können diese Zeichenfolge einfach analysieren.

Instant instant = Instant.parse( "2017-01-23T12:34:56.123456789Z" ) ; 

ISO 8601

Die Norm ISO 8601 definiert übersichtliche, leicht zu analysierende Formate für die Darstellung von Datums- und Uhrzeitwerten in Textform. Diese Formate sind ideal für den Datenaustausch.

Für einen Moment in UTC bedeutet dies das oben gezeigte Format. Das T trennt den Datumsanteil vom Tageszeitanteil. Das Z am Ende steht für Zulu und bedeutet UTC.

Gebietsschema

In der Frage wird das Gebietsschema als zeitzonenbezogen angegeben. Ein Locale hat nichts mit Zeitzone zu tun. Ein Locale spezifiziert (a) die menschliche Sprache für die Übersetzung von Name des Tages, Name des Monats und dergleichen, und (b) die kulturellen Normen, die über Fragen der Abkürzung, Großschreibung, Zeichensetzung und dergleichen entscheiden.

Eine Zeitzone ist ein Verlauf von Änderungen des Versatzes einer Region von UTC , wobei Anomalien nachverfolgt werden, die Änderungen wie Sommerzeit (DST) .

Durchsuchen Sie den Stapelüberlauf, um weitere Informationen zu erhalten. Dies wurde bereits hunderte Male behandelt. Suchen Sie nach Klassen wie ZoneId, ZoneOffset, ZonedDateTime, Instant, OffsetDateTime und DateTimeFormatter. Lesen Sie das Oracle Tutorial zu den Java.time-Klassen.

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;

About Java.time

Das Java.time Framework ist in Java 8 und höher eingebaut. Diese Klassen verdrängen das lästige alte Legacy Datum-Zeit-Klassen wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Joda-Time Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration auf das Java.time Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Sie können Java.time Objekte direkt mit Ihrer Datenbank austauschen. Verwenden Sie einen JDBC-Treiber , der mit JDBC 4.2 oder höher kompatibel ist. Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für Java.sql.* Klassen.

Woher bekommen Sie die Java.time-Klassen?

Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von Java.time. Hier finden Sie möglicherweise einige nützliche Klassen wie Interval , YearWeek , YearQuarter und mehr .

4
Basil Bourque

Der richtige Weg, dies zu tun, besteht darin, Ihr Datum im ISO 8601-Format zu schreiben: 2015-08-03T4:50:49+00:00

Es enthält nicht nur die Zeitzone, sondern auch jeder Standarddecoder auf der Empfängerseite Ihres JSON kann diesen problemlos decodieren.

Wenn Sie den String selbst schreiben, formatieren Sie ihn einfach:

ZonedDateTime.now( ZoneId.systemDefault() )
             .format( DateTimeFormatter.ISO_DATE_TIME )

Wenn Sie jedoch JSON-Serialisierer verwenden, um Ihre Java-Objekte (z. B. Jackson) zu transformieren, machen Sie das Objektattribut einfach zu Java.util.Date, und der Serialisierer sollte wissen, was zu tun ist, wenn Sie die richtigen Einstellungen vornehmen. Siehe diese Antwort für Jackson oder diese für Jersey. Beide nutzen Joda Time.

2
mprivat

Ich denke, es gibt den einfachen Weg, dies zu tun,

DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
yourJsonObject.accumulate("yourDateVarible",dateFormat.format(new Date()));
1
SwapnilKumbhar

Dafür gibt es viele Möglichkeiten. Eine Möglichkeit, das Datum in Millisekunden zu konvertieren, die nicht vom Gebietsschema abhängt, und es weiter verwenden .. Eine andere Möglichkeit, das Datum im utc-Format zu ändern und es weiter zu verwenden funktioniert einwandfrei, da bei der Verwendung des neuen Datums ("ein Datum") standardmäßig die Systemzeitzone verwendet wird. Beispiel:

   long lastAccessedDate =  110002028250;
  String myDate = new Java.util.Date(lastAccessedDate()).toString();

myDate wird "Di Jun 06 05:30:00 UTC 2017" sein, wenn die Zeitzone des Systems UTC ist.

0