Sto utilizzando Spring MVC su una macchina che ha l'ora legale configurata (fuso orario America/Sao_Paulo). Nella mia classe forma ho usato il DateTimeFormat annotazioni per configurare l'uscita del mio Data:Errore di conversione di Spring @DateTimeFormat con l'ora legale
public class JustificativaOcorForm {
...
@NotNull
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date dataMarcacao;
...
}
Durante il debug sto ottenendo la data 16/10/2011 (gg/mm/aaaa) che è l'inizio della luce del giorno tempo, ma Spring lo converte nel 2011-10-15. Perché?
2011-11-04 16:35:31,965 [http-8080-Processor25] DEBUG org.springframework.core.convert.support.GenericConversionService - Converting value Sun Oct 16 00:00:00 BRST 2011 of [TypeDescriptor @javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.util.Date] to [TypeDescriptor java.lang.Long]
2011-11-04 16:35:31,965 [http-8080-Processor25] DEBUG org.springframework.core.convert.support.GenericConversionService - Converted to 1318730400000
2011-11-04 16:35:32,010 [http-8080-Processor25] DEBUG org.springframework.core.convert.support.GenericConversionService - Converted to '2011-10-15'
vedo questa domanda: @DateTimeFormat in Spring produces off-by-one day error
ma Spring 3 utilizza Joda-Time e ho Joda-tempo-2.0.jar nel mio percorso di classe in modo da non so il motivo per cui questo accade e come posso risolvilo.
[EDIT]
Ho provato la creazione di oggetti LocalData, e trovato qualcosa:
LocalDate ld = new LocalDate(new SimpleDateFormat("dd/MM/yyyy").parse("16/10/2011").getTime());
System.out.println(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss Z z").format(ld.toDate()) );
//prints 15/10/2011 00:00:00 -0200 BRST
LocalDate ld2 = new LocalDate(2011,10,16);
System.out.println(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss Z z").format(ld2.toDate()) );
//prints 16/10/2011 00:00:00 -0200 BRST
Sembra che il primo approccio è pensare che il tempo è in UTC, perché il debug mi possiamo vedere che Joda usa il metodo convertUTCToLocal della classe DateTimeZone.
Forse questo è l'impostazione predefinita anche per la primavera, si aspetta anche una data in UTC e sto passando la data BRT.
Quindi penso che la mia soluzione sia modificare gli oggetti in LocalDate e utilizzare il secondo modo per creare l'istanza di questo oggetto.
Non è chiaro: stai convertendo * in * una stringa, o * da * una stringa? Inoltre, se questa è solo una data, sarebbe meglio usare il tipo 'LocalDate' di Joda. –
@JonSkeet è una data da stringere. Posso impostare LocalDate con @DateTimeFormat? –
Mi aspetterei di sì. Tieni presente che il valore di "Data" sembra essere mezzanotte * BRST * del 16 ottobre ... è deliberato? Certo, è strano che venga formattato come il 15 ottobre ... ma in generale sarebbe meglio evitare i fusi orari se si utilizzano le date :) –