2016-10-04 4 views
1

Ich versuche die automatische String-zu-Datum-Konvertierung des Spring zu verwenden, wenn das Datum @PathVariable unter Verwendung von @DateTimeFormat lautet. Die automatische Konvertierung ist abgeschlossen, aber aus irgendeinem Grund wird das Datum in das Datum konvertiert, an dem ich vergangen bin minus vier Stunden (Ostersonntagzeit, wo sich Server und Client befinden).Spring @DateTimeFormat ändert die Zeitzone beim Konvertieren von @PathVariable in das Datum

Beispiel:

URL: (. Dh 20.00 Uhr des Vortages, die 4 Stunden nach dem Datum, das ich bestehen) .../something/04-10-2016/somename Werden someDate Objekt mit dem Wert 2016.10.03 20.00.00 führen

Wie vermeide ich diese automatische Zeitzonenumwandlung. Ich brauche keine Zeitzoneninformationen und diese Konvertierung bricht das erwartete Verhalten.

Hier ist mein Code:

@RequestMapping(value = "/something/{someDate}/{name}", method = RequestMethod.GET, headers = "Accept=application/json") 
@ResponseBody 
public SomeObject getDetails(@PathVariable @DateTimeFormat(pattern = "dd-MM-yyyy") Date someDate, 
    @PathVariable String name) { 
    // date here comes as GMT - 4 
    // more code here 
    // return someObject; 
} 

Denn ich jetzt, ich bin nur durch das Lesen der Pfadvariablen als String und mit SimpleDateFormatter um diese Arbeit den String zu Datum manuell zu konvertieren.

Gibt es eine Idee, wie ich die automatische Konvertierung ohne Zeitzonenumwandlung bekommen kann?

Antwort

0

Do Nhu Vy des answer wies in die richtige Richtung lösen; aber anstatt die Zeitzoneninformationen hinzuzufügen, musste ich sie entfernen.

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

dies aus der Config entfernt und allein gelassen, die Standard-Zeitzone. Das hat für mich funktioniert.

+0

Hallo Suraj, können Sie bitte URL der Antwort teilen Geschrieben von Do Nhu – GSK

0

Ursache des Problems ist wahrscheinlich die Zeitzone, java.util.Date Augenblick Zeit ist daher in Eastern Time Zone umgewandelt zurück Sie den Wert sehen. wenn Sie java8 verwenden, sollten LOCALDATE das Problem für Sie

@PathVariabl @DateTimeFormat(pattern = "dd-MM-yyyy") LocalDate date 

Nach Post einige Optionen für Sie ordentlich

https://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-parsing-date-and-time-information-from-a-request-parameter/

+0

Ich habe das nicht versucht; Aber selbst wenn es funktionierte, müsste ich "LocalDate" in "Date" konvertieren, da die von mir verwendete API das Date-Objekt verwendet. Das ist fast so gut wie mit 'SimpleDateFormatter'. –

0

Ich habe das gleiche Problem und ich füge nur die UTC in meine Serializer-Datei. Was ich meine, statt:

private static final DateTimeFormatter FORMATTER = ISODateTimeFormat.dateHourMinute(); 

I verwendet:

private static final DateTimeFormatter FORMATTER = ISODateTimeFormat.dateHourMinute().withZoneUTC(); 

Dies ist der letzte Code des vollständigen JsonJodaDateTimeSerializer.java ist:

package cat.meteo.radiosondatge.commons; 

import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.SerializerProvider; 
import java.io.IOException; 
import org.joda.time.DateTime; 
import org.joda.time.format.DateTimeFormatter; 
import org.joda.time.format.ISODateTimeFormat; 

/** 
* When passing JSON around, it's good to use a standard text representation of 
* the date, rather than the full details of a Joda DateTime object. Therefore, 
* this will serialize the value to the ISO-8601 standard: 
* <pre>yyyy-MM-dd'T'HH:mm:ss.SSSZ</pre> This can then be parsed by a JavaScript 
* library such as moment.js. 
*/ 
public class JsonJodaDateTimeSerializer extends JsonSerializer<DateTime> { 

    private static final DateTimeFormatter FORMATTER = ISODateTimeFormat.dateHourMinute().withZoneUTC(); 

    @Override 
    public void serialize(DateTime value, JsonGenerator gen, SerializerProvider arg2) 
      throws IOException, JsonProcessingException { 

     gen.writeString(FORMATTER.print(value) + 'Z'); 
    } 

} 

Dieser Code aus Serializing Joda DateTime with Jackson and Spring

extrahiert

Hoffe es hilft.

Verwandte Themen