2012-01-18 15 views
14

Ho un oggetto JavaScript con Data proprietà che viene convertito in JSON utilizzando JSON.stringifyJavaScript e Java Data serializzazione JSON

Sono in GMT + 4 fuso orario (Russia/Mosca)

Per esempio , 5 Jan 2012 converte in 2012-01-04T20:00:00.000Z

5 Jan 1975 converte in 1975-01-04T20:00:00.000Z

Ma nel 1975 era GMT + 3 fuso orario, come l'ora legale è stata annullata in Russia nel 2011. Così, quando si cames al server (Java) è deserializza come:

2012-01-04T20:00:00.000Z diviene 5 Jan 2012 00:00 - OK

1975-01-04T20:00:00.000Z diviene 4 Jan 1975 23:00 - SBAGLIATO!

Qual è il metodo consigliato per convertire l'oggetto Date in JSON in Javascript?

+0

Questo potrebbe essere utile. Forse anche un possibile duplicato: http://stackoverflow.com/questions/4032967/json-date-to-java-date – Johan

risposta

12

Suggerirei di passare la data/l'ora usando i loro secondi dalla notazione epoch, in particolare il numero di secondi dall'Eixx Epoch (1 gennaio 1970 00:00 GMT). Se non hai familiarità con questo, c'è un esempio convertitore qui: http://www.epochconverter.com/

Questo ha alcuni vantaggi:

  • Si riferisce allo stesso momento nel tempo indipendentemente dal fuso orario. Ciò aiuta a memorizzare l'ora indipendentemente dagli errori di fuso orario (anche se, naturalmente, dovrebbero essere immessi correttamente).
  • È l'unico costruttore non deprecato (tranne il costruttore senza parametri) in java.util.Date, vedere anche (getTime()). (Si noti che questo utilizza millisecondi.)
  • JavaScript può creare la data da esso abbastanza facilmente (ad esempio new Date(1000 * 1326894706)). (Si noti che questo utilizza millisecondi.)
  • Se è importante, sarà sempre un po 'più piccolo (in termini di dimensioni dei dati nella sua serializzazione JSON) rispetto a qualsiasi di "yyyy-MM-dd HH:mm:ss".
  • Se si desidera rendere il fuso orario associato a questo numero, è sempre possibile aggiungere un campo aggiuntivo alla propria rappresentazione. { "datetime": 1326894706, "tz": "GMT" } è ancora più corto di { "datetime": "18 Jan 2012 13:51:46 GMT" }.

Considerando che è facile da ottenere Date istanze da questo in Java e JavaScript, è possibile quindi utilizzare un DateFormatter per convertirlo da/per il testo in Java. Per JavaScript, l'utilizzo di una libreria come Date Format ti aiuterà a renderlo appropriato sulla pagina (ad esempio con qualcosa come new Date(val * 1000).format("yyyy-mm-dd HH:MM")).

+0

Ho fatto ulteriori ricerche e ho scoperto che l'epoca è trattata in modo diverso in java e javascript (http://stackoverflow.com/questions/8913059/javascript-date-and-java-util-date-constructor-argument). Se non posso fare affidamento sul metodo getTime() non ho idea di come usare Epoch Time. – ike3

+0

Si comportano in modo diverso solo nel modo in cui legano il fuso orario al luogo in cui si trovano al momento. Ho pensato che il tuo contributo fosse (corretto) istanze di JS 'Date' in primo luogo? Come li costruisci? Puoi mostrare un esempio di come hai prodotto '5 Jan 1975' inizialmente? – Bruno

+0

Ricevo date da jQuery DatePicker $ ("date"). DatePicker ("getTime") quando 5 gennaio 1975 viene scelto nel calendario. Quindi viene serializzato su JSON utilizzando JSON.stringify, che utilizza la differenza di 4 ore indipendentemente dall'anno. Ma Java sa che prima del 2011 era GMT + 3 e lo deserializza nel modo corretto così ho 1 ora di differenza per le date precedenti al 2011 – ike3

0

Personalmente mi convertirli in stringa in Java utilizzando qualcosa di simile:

String theDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); 

E poi la stringa viene serializzato. Nel lato javascript, basta analizzarlo.

+0

Penso che il problema sia in corso * da * JavaScript * a * Java. – Pointy

+0

O viceversa: stringify in Javascript per analizzare in Java, poiché l'autore vuole Javascript-> Java, se ho letto correttamente la domanda. – Zlatko

+0

Sì, sto pensando di scrivere un serializzatore/deserializzatore personalizzato per Spring MVC + Jackson. – ike3

0

JSON non ha il supporto Date, tutti i parser/serializzatori usano toString o qualcosa del genere.Spetta a te serializzare/deserializzare le date.
Dal momento che Javascript non include un formattatore di data decente incluso, la soluzione più semplice è trasformare la data in lunga. Ma se si vuole essere in grado di leggere quello che sta succedendo, mi raccomando http://www.datejs.com/ e formattazione date come yyyy-MM-dd hh: mm: ss

13

preferisco attenersi a javascript formato data ISO 8601, durante l'analisi si correttamente gestirà automaticamente le differenze di fuso orario.

in Java è possibile analizzare una javascript data stringata JSON come segue:

String iso8601Date = "2013-08-13T14:15:00.000Z"; 
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
Date parsedDate = formatter.parse(iso8601Date); 

Quando si accende di nuovo in stringhe, avrete qualcosa di simile

//"2013-08-13T16:15:00.000+02:00" 
String formattedDate = formatter.format(parsedDate); 

Per l'analisi JSON io uso FlexJson, che puoi configurare in questo modo.

//Serializing to JSON 
DateTransformer dateTransformer = new DateTransformer("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
new JSONSerializer().transform(dateTransformer, Date.class).serialize(object); 
//deserialize From JSON (replace object by java class) 
JSONDeserializer<..Object..>().use(Date.class, dateTransformer).deserialize(json); 
+0

+1. Grazie per "yyyy-MM-dd'T'HH: mm: ss.SSSXXX" :) – TheKojuEffect

1

Se si utilizza Spring Framework è possibile utilizzare l'annotazione @JsonSerialize(using = CustomLocalDateSerializer.class) e @JsonDeserialize(using = ISO8601LocalDateDeserializer.class). Analizzerà correttamente il tuo javascript Date.

Esempio:

public class product { 

    @NotNull 
    private Long id; 

    @NotNull 
    private String name; 

    @JsonSerialize(using = CustomLocalDateSerializer.class) 
    @JsonDeserialize(using = ISO8601LocalDateDeserializer.class) 
    private LocalDate date; 

    // getter and setter... 
} 
Problemi correlati