2016-04-04 33 views
1

:Jersey + JodaTime = Okuma dateTime yanlış ben göndermek ve doğru tarih millis ile JSON göndermek bile veritabanında doğru tarihini saklamak ve Jersey 2.</p> <p>kullanıyorum

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

"Güneş 10 Nisan 2016 13:00:00" ve sonudur: Gördüğünüz gibi, başlangıç ​​olduğunu

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

I: "Güneş 10 Nisan 2016 14:00:00" ama müşteri hata ayıklama bu tarihleri ​​al:

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

3 saat sonra yanlış anladım. Bu, test ettiğim tüm diğer zamanlarla gerçekleşir: tarih doğru, zaman 3saat +.

Bunu nasıl düzeltebileceğiniz hakkında bir fikriniz var mı? Verilen tarihten 3 saat çıkartabileceğimi biliyorum, ama bunun son çare olması gerektiğine inanıyorum. hahaha Sadece çok çirkin

diğer bilgiler

Müşteri oluşturma: Sunucu ilk başta yanlış alıyordum çünkü ben forması doğru DateTime değerini GÖNDER yapmak bulundu yolu ObjectMapper edildi oluşturma

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

. Bundan sonra, verileri doğru bir şekilde gönderiyorum ve mysql üzerinde de doğru şekilde saklayabildim.

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

    return result; 
} 

Gerçek Soru

Nasıl Jersey'deki TimeZone ayarlamak için

? ObjectMapper'da olduğunu sanıyordum ama yanlış tahmin ettim.

cevap

1

Gördüğünüz gibi, başlangıç ​​şudur: "Güneş 10 Nisan 2016 13:00:00" ve sonudur: "Güneş 10 Nisan 2016 14:00:00" sizin zamanınızda Belki

bölge, ancak UTC'de bu değirmenler 16:00 ve 17:00 'yi temsil eder - böylece elde ettiğiniz sonuç doğrudur.

İhtiyacınız olan şey bu ise, yerel saat diliminize dönüştürün.

+0

, ama forması benim için bunu yapmak istiyorum. Nasıl olduğunu biliyor musun? –

+0

@MarcoNoronha 'jerseyDateTime.toDateTime (DateTimeZone.getDefault())' öğesini çağırabilirsiniz. – assylias

+0

Assylias :(Bunu bulamıyorum Ben ObjectMapper üzerinde olacağını düşündüm ama sanırım değil –

1

Bu, saat dilimlerinin bir sorunu olmalıdır. UTC zaman dilimi içinde her şeyi yazın ve UTC'de okuyun, ardından kullanıcının hedef saat dilimine dönüştürebilirsiniz. İşte

Ben gerekenler Bu bir java örneği ( 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

Tamam, Jersey'de saat dilimini ayarlamak için bir yol mu bu yüzden zaten onu dönüştürür? –

+0

Bir iyi Uygulama, UTZ'yi saklamaktır, böylece herzamanki bu zaman diliminin UTC olduğunu bilirsiniz ve sonra (müşteri tarafında) istemciye, müşterinin saat dilimine bağlı olarak (örneğin Javascript'e) sahip olursunuz. daha fazla yardım bana söyleyebilir. – jeorfevre

+0

Sorun değil, ama benim için bu dönüşümü yapmak için jarse nasıl yapabilirim bilmem gerekiyor. Nasıl olduğunu biliyor musun? –