Używam Spring MVC na komputerze, który ma skonfigurowany czas letni (strefa czasowa America/Sao_Paulo). W moim klasy formularza użyłem DateTimeFormat adnotacji do skonfigurowania wyjścia mojego Data:Konwersja Spring @DateTimeFormat z czasem letnim
public class JustificativaOcorForm {
...
@NotNull
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date dataMarcacao;
...
}
Podczas debugowania Dostaję datę 16/10/2011 (dd/mm/rrrr), który jest początkiem światła dziennego czas, ale Spring zamienia go na 2011-10-15. Czemu?
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'
widzę to pytanie: @DateTimeFormat in Spring produces off-by-one day error
ale Wiosna 3 wykorzystuje Joda-Time i mam Joda-Time-2.0.jar w mojej ścieżce klasy więc nie wiem, dlaczego tak się dzieje i jak mogę rozwiązać.
[EDIT]
Przetestowałem tworzenia objets LocalData i znalazł coś:
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
Wydaje się, że pierwsze podejście jest myślenie, że czas jest w UTC, ponieważ debugowania widać, że Joda używa metody convertUTCToLocal klasy DateTimeZone.
Może to również jest domyślne w Spring, on też spodziewa się jednej daty w UTC i przejdę do daty BRT.
Myślę, że moim rozwiązaniem jest zmiana obiektów na LocalDate i użycie drugiej metody tworzenia instancji tego obiektu.
Nie jest jasne - czy konwertujesz * na * ciąg znaków, czy * na * ciąg znaków? Ponadto, jeśli ma to być tylko data, lepiej byłoby użyć typu 'LocalDate' firmy Joda. –
@ JonSkeet to data na ciąg. Mogę ustawić LocalDate z @DateTimeFormat? –
Z pewnością bym tego oczekiwał. Zauważ, że twoja wartość "Date" wydaje się być północą * BRST * 16 października ... czy to celowe? Wprawdzie to dziwne, że jest sformatowany jako 15 października ... ale ogólnie lepiej byłoby całkowicie unikać stref czasowych, jeśli używasz dat :) –