2016-04-04 12 views
1

Ich verwende Jersey 2.Jersey + JodaTime = Lese Datums- und Uhrzeit falsch

ich sende und speichern Sie das Datum korrekt in der Datenbank, und sogar die JSON mit dem richtigen Zeitpunkt millis senden:

//Debbuged using LoggingFilter 
{"id":3,"start":1460304000000,"end":1460307600000} 

wie Sie sehen können, starten ist: „Sun 10. April 2016 13.00.00“ und das Ende ist: „Sun 10. April 2016 14.00.00“, aber wenn ich debuggen den Client:

SaveablePersonalSchedule dto = response.readEntity(SaveablePersonalSchedule.class); 

I Erhalten Sie diese Daten:

START: 2016-04-10T16:00:00.000Z 
END: 2016-04-10T17:00:00.000Z 

Bis 3 Stunden falsch. Dies geschieht mit allen anderen Zeit, die ich getestet habe: Das Datum ist korrekt, die Zeit ist 3 Stunden +.

Irgendwelche Ideen, wie Sie das beheben können? Ich weiß, ich kann 3 Stunden ab dem angegebenen Datum abziehen, aber ich glaube, das sollte der letzte Ausweg sein. Auch nur hässlich hahaha

Mehr Infos

Client-Erstellung:

client = ClientBuilder.newClient(new ClientConfig() 
     .register(new JerseyObjectMapperProvider()) 
     .register(new Jackson1Feature()) 
     .register(new MultiPartFeature())); 

die ObjectMapper Erstellen wurde mit der Art, wie ich gefunden Trikot den richtigen Datetime-Wert machen SEND, da der Server es falsch zunächst empfängt . Danach sende ich die Daten korrekt und konnte sie auch auf mysql korrekt speichern.

private static ObjectMapper createDefaultMapper() { 
    final ObjectMapper result = new ObjectMapper(); 
    result.configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false); 

    return result; 
} 

wirkliche Frage

Wie Time-Zone auf Jersey setzen? Ich dachte, es wäre auf dem ObjectMapper, aber ich vermute falsch.

Antwort

1

Wie Sie sehen können, starten ist: "Sun 10. April 2016 13.00.00" und das Ende ist: "Sun 10. April 2016 14.00.00"

in Ihrer Zeit Vielleicht Zone, aber in UTC repräsentieren diese Millisekunden 16:00 und 17:00 Uhr - das Ergebnis ist also korrekt.

Konvertieren Sie es in Ihre lokale Zeitzone, wenn Sie das brauchen.

+0

Das ist, was ich brauche, aber ich will Jersey es für mich zu tun. Weißt du wie? –

+0

@MarcoNoronha Sie können 'jerseyDateTime.toDateTime (DateTimeZone.getDefault())' aufrufen. – assylias

+0

Ich kann es nicht finden Assylias :(Können Sie mir helfen? Ich dachte, es wäre auf dem ObjectMapper, aber ich denke nicht. –

1

Dies sollte eine Frage der Zeitzonen sein. Schreiben Sie alles in die UTC-Zeitzone und lesen Sie in UTC und konvertieren Sie dann in die Zielzeitzone des Benutzers.

Hier ist ein Java-Beispiel (and gist here)

import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone; 

import org.junit.Test; 

public class DateTimeTest { 

    public static final String PARIS_TZ="GMT+1"; 


    @Test 
    public void datetime(){ 
     SimpleDateFormat formatterGMT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
     SimpleDateFormat formatterPARIS = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
     formatterPARIS.setTimeZone(TimeZone.getTimeZone(PARIS_TZ)); 

     Date date = new Date();  

     log("UTC: "+ formatterGMT.format(date)); 
     log("PARIS:"+ formatterPARIS.format(date)); 

    } 


    public void log(String s){ 
     System.out.println(s); 
    } 

} 

Check timezone doc here

+0

Ok, Ist das ein Weg, die Zeitzone auf Jersey es selbst zu setzen, so dass es bereits konvertiert? –

+0

A good Praxis ist, die Zeitzone UTC zu speichern, so dass Sie immer wissen, dass die Zeitzone UTC ist, und nachher (auf der Client-Seite) präsentieren Sie es dem Client abhängig von seiner Client-Zeitzone (die Sie in Javascript zum Beispiel bekommen) mehr Hilfe kann mir sagen. – jeorfevre

+0

Kein Problem, aber ich muss wissen, wie ich Jersey machen kann, um diese Umwandlung für mich zu machen. Weißt du wie? –

Verwandte Themen