SORU
3 ŞUBAT 2009, Salı


UTC zaman dilimi JPA/Hazırda bekleme deposu tarih

Nasıl (GMT) UTC saat dilimi veritabanında tarih/saat saklamak için JPA/Hazırda Beklet yapılandırabilirsiniz? Bu açıklamalı JPA varlık düşünün:

public class Event {
    @Id
    public int id;

    @Temporal(TemporalType.TIMESTAMP)
    public java.util.Date date;
}

Eğer tarih 2008-Şub-03 9:30 Pasifik Standart Saati (PST) ise, 2008-Feb-03 5:30 UTC zaman veritabanında saklanan istiyorum. Tarih veritabanından alındığında, benzer şekilde, UTC olarak yorumlanır istiyorum. Bu durumda 530pm 530pm UTC. Görüntülenen zaman 9:30 am PST olarak biçimlendirilecektir.

CEVAP
7 AĞUSTOS 2010, CUMARTESİ


Hazırda Tarihleri çünkü hiç yok () saat dilimi şeyler cahil, ama aslında yol açan bu katman BULUNMAKTAYDI. Seviyesinde bağımsız.getTimestamp ve PreparedStatement.setTimestamp onlar okuma ve veritabanına/yazarken varsayılan olarak geçerli JVM saat/tarih dönüştüren onların belgeleri de derim.

Hazırda 3.5 bu çözüm ile org sınıflara göre geldim.Hazırda Beklet.yazın.TimestampType bu OLANLARI yöntemleri yerel saat dilimi yerine UTC kullanmaya zorlar:

public class UtcTimestampType extends TimestampType {

    private static final long serialVersionUID = 8088663383676984635L;

    private static final TimeZone UTC = TimeZone.getTimeZone("UTC");

    @Override
    public Object get(ResultSet rs, String name) throws SQLException {
        return rs.getTimestamp(name, Calendar.getInstance(UTC));
    }

    @Override
    public void set(PreparedStatement st, Object value, int index) throws SQLException {
        Timestamp ts;
        if(value instanceof Timestamp) {
            ts = (Timestamp) value;
        } else {
            ts = new Timestamp(((java.util.Date) value).getTime());
        }
        st.setTimestamp(index, ts, Calendar.getInstance(UTC));
    }
}

Aynı şeyi eğer bu tür kullanırsanız TimeType ve DateType düzeltmek için yapılmalıdır. Dezavantajı olduğunu göreceksiniz manuel olarak belirttiğiniz bu tür kullanılacak yerine varsayılan her Tarih Alanı içinde POJOs (ve aynı zamanda sonları saf JPA uyumluluk), sürece kimse bilir bir daha genel geçersiz kılma yöntemi.

GÜNCELLEME: Uyku 3.6 türleri API değişti. 3.6, ben yazdım bunu uygulamak için bir sınıf UtcTimestampTypeDescriptor.

public class UtcTimestampTypeDescriptor extends TimestampTypeDescriptor {
    public static final UtcTimestampTypeDescriptor INSTANCE = new UtcTimestampTypeDescriptor();

    private static final TimeZone UTC = TimeZone.getTimeZone("UTC");

    public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
        return new BasicBinder<X>( javaTypeDescriptor, this ) {
            @Override
            protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
                st.setTimestamp( index, javaTypeDescriptor.unwrap( value, Timestamp.class, options ), Calendar.getInstance(UTC) );
            }
        };
    }

    public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
        return new BasicExtractor<X>( javaTypeDescriptor, this ) {
            @Override
            protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
                return javaTypeDescriptor.wrap( rs.getTimestamp( name, Calendar.getInstance(UTC) ), options );
            }
        };
    }
}

Şimdi app başladığında, eğer TimestampTypeDescriptor ayarlarsanız.UtcTimestampTypeDescriptor örneği ÖRNEĞİ tüm zaman damgaları ve POJOs üzerindeki açıklayıcı değiştirmek zorunda kalmadan UTC olarak saklı tutulacaktır. [Henüz test etmedim]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013