Spring @DateTimeFormat Fehler bei der Konvertierung mit Sommerzeit

Ich bin mit Spring MVC auf eine Maschine, in der Sommerzeit konfiguriert (America/Sao_Paulo Zeitzone). In meiner form-Klasse, die ich verwendet die annotation DateTimeFormat zum konfigurieren der Ausgabe des meiner-Datum:

public class JustificativaOcorForm {
  ...
  @NotNull
  @DateTimeFormat(pattern="yyyy-MM-dd")
  private Date dataMarcacao;
  ...
}

Beim Debuggen bin ich immer das Datum 16/10/2011 (TT/MM/JJJJ) dass der Anfang der Sommerzeit, aber der Frühling, wandelt zu 2011-10-15. Warum?

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'

Sehe ich diese Frage: @DateTimeFormat im Frühjahr produziert off-by-one Tag-Fehler

aber der Frühling 3 verwendet Joda-Time und ich habe joda-time-2.0.jar in meinem classpath, also ich weiß nicht, warum dies geschieht und wie ich es lösen kann.

[BEARBEITEN]

Ich getestet habe erstellen LocalData objets, und etwas gefunden:

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

Scheint es, dass der erste Ansatz ist zu denken, dass das die Zeit ist in UTC, weil das Debuggen kann ich sehen, dass Joda mit der Methode convertUTCToLocal der Klasse DateTimeZone.

Vielleicht ist das der Standard der Frühling, er erwartet eine Datum in UTC zu und ich leite die BRT-Datum.

So, ich denke meine Lösung ist die Veränderung der Objekte zu LocalDate und verwenden Sie die zweite Methode zum erstellen der Instanz dieses Objekts.

  • Es ist nicht ganz klar - sind Sie konvertieren zu einem string oder aus einem string? Auch, wenn dies nur dazu gedacht, ein Datum, es wäre besser, verwenden Joda ist LocalDate geben.
  • es ist ein Datum zu String. Ich kann LocalDate mit @DateTimeFormat?
  • Ich würde sicherlich erwarten, dass so. Beachten Sie, dass Ihre Date Wert erscheint um Mitternacht BRST am 16 Oktober... ist das absichtlich? Zugegeben, es ist seltsam, dass, die wird formatiert als 15. Oktober... aber wäre es generell besser, zu vermeiden, Zeitzonen völlig, wenn man mit Termin 🙂
  • Ich denke, der Wert ist BRST, weil Sie die Zeitzone des Servers. Das interessante ist, dass die Verwendung von " = SimpleDateFormat ich nicht dieses Problem haben. Auch, wie ist der beste Weg zum konfigurieren von java zu vermeiden Zeit-zone im Frühjahr MVC-Kontext?
  • Leider, während ich bequem auf Zeitzonen habe ich noch nicht verwendet, Spring MVC bei allen 🙁
  • es ist nicht wirklich so Aussehen, wie Sie mit joda Zeit
  • trotzdem können Sie ändern Sie die @DateFormat-string, so dass es druckt die timezone?
  • interessant: es druckt 2011-10-15 BRT
  • siehe mein edit.

Schreibe einen Kommentar