2010-01-20 18 views
8

GWT non serializza Java Data correttamente. Quando ho provato a inviare Data creato in Javascript attraverso il filo, ho scoperto che le date tra il 1 ° aprile (divertente) e il 25 ottobre per gli anni precedenti all'anno 1983 vengono sottratte di un giorno.GWT java.util.Date serialization bug

Ciò significa che, ad esempio, sia il 1982-04-01 che il 1982-03-31 diventano 1982-03-31 sul lato Java.

Date le date in questione, direi che si tratta di una sorta di problema di ora legale. Ho provato su google e ho trovato solo one other reference che descrive un problema simile.

Ho anche provato a inviare bug al team GWT, ma curiosamente non sono riuscito a trovare bugtracker per GWT.

Quindi, le mie domande sono:

  1. Chiunque run altro in questo? Sono su GWT 1.7 e vorrei confermare se questo accade anche su 2.0.

  2. La mia soluzione era di inviare date come stringhe e analizzarle sul server. Qualcuno conosce una soluzione migliore?

+1

Abbiamo incontrato altri problemi relativi alla data (non so più cosa fossero) quindi siamo passati alle stringhe. – Drejc

risposta

5

Supponendo che si sta utilizzando un java.util.Date

Domanda 1: Sembra che sia fissato in 2.0. Ho creato entrambe le date sopra (1982-04-01 e 1982-03-31) e arrivano correttamente al server (entrambi rappresentano sul server rispettivamente come 1982-04-01 e 1982-03-31). La mia configurazione è:

  • GWT 2.0
  • Java 1.6
  • OSX 10.6.2

Domanda 2: Si può sempre passare i 'millisecondi dal 1 gennaio 1970, 00:00:00 GMT 'sul servizio asincrono, che puoi ottenere usando getTime() sull'oggetto data. Sul lato server è quindi possibile creare un'istanza di una nuova data che trasmette questo valore al costruttore:
Date date = new Date(millis);
Ciò consente di risparmiare con formattatori e parser.

+1

In realtà GWT sta già serializzando utilizzando millisecondi, ma perde il fuso orario. Quindi un "3. Aprile 2001 00:00 GMT" nel browser potrebbe diventare "2. Aprile 2001 23:00 CET" sul server. E se guardi solo la data sembra che sia un giorno libero, anche se il tempo reale indica lo stesso. – Stroboskop

0

Abbiamo anche incontrato un problema simile. Era abbastanza tempo fa che non ricordo i dettagli esatti ma il succo era che c'erano alcune piccole differenze tra java.util.Date e il modo in cui le date venivano gestite in Javascript. La nostra soluzione alternativa era effettivamente uguale alla tua, in cui il valore effettivo inviato sul filo era generalmente una stringa.

1

Se non si devono eseguire conversioni lato client (adattarsi al fuso orario dell'utente) o calcoli, inviarlo in una stringa dal server.

Non si è mai verificato il problema specifico.

2

Le date e gli orari sono un argomento complicato. La conversione può dipendere dalle impostazioni locali in cui viene eseguito il browser e dal fatto che sia JVM sul server sia le versioni locali dei client siano aggiornate.

In alcuni casi possono esserci delle differenze perché in alcune regioni hanno commutato i fusi orari nel passato.

GWT invia le date utilizzando solo millisimi dal momento storico.Poiché utilizza gli oggetti Date, si è limitati nel fatto che le Date sul lato server verranno automaticamente modificate nel fuso orario dei server. Sei sicuro di prendere in considerazione la possibile differenza di fusi orari tra client e server?

David

+0

Nel mio caso, server e client erano entrambi in esecuzione sulla stessa macchina, quindi è sicuramente un problema di serializzazione GWT. – Domchi

+0

Forse hanno lo stesso fuso orario ORA. Ma guardando le date, penso che tu abbia appena scoperto l'ora legale. E una delle macchine/servizi non tiene conto di ciò durante la serializzazione dell'ora. E a prescindere da ciò, non penso che tu voglia fare un webservice che dipenda dal fuso orario del browser che è lo stesso di quello del server. – Stroboskop

1

i possibili problemi soure è la differenza di fuso orario client/server.

+0

Vedere la mia risposta a David, client e server si trovano nello stesso fuso orario. Credo che il problema sia che Javascript e Java gestiscono le date in modo diverso, quindi l'invio di millisecondi non è abbastanza buono. – Domchi