2015-06-04 21 views
7

Ben bir java.sql.Timestamp dönüştürmek istiyorum bir java.time.OffsetDateTime var. Timestamp herhangi bir ofset bilgisini kaydetmediğinden, veritabanındaki tüm tarihleri ​​/ saatleri UTC olarak kaydedeceğim.Dönüştürme OffsetDateTime UTC zaman damgası

OffsetDateTime'u UTC'deki Timestamp'a nasıl dönüştürebilirim?

DÜZENLEME:

Bu cevap inanıyoruz ama UTC gizli için oldukça dolambaçlı bir yoldur görünüyor: (referans tarihinden itibaren saniyelik # almak için

OffsetDateTime dateTime = OffsetDateTime.now(); 
Timestamp timestamp = Timestamp.valueOf(dateTime.atZoneSameInstant(ZoneId.of("Z")).toLocalDateTime()); 

cevap

7

Bu, dönüştürmeyi yapmanın ve UTC'nin kullanılmasının sağlanmasının bir yolu olabilir. Bence bu, saniyelik zaman aralığını kullanarak önerdiğim çözümden biraz daha temiz.

Timestamp test = Timestamp.valueOf(entityValue.atZoneSameInstant(ZoneOffset.UTC).toLocalDateTime()); 
+0

Bu yanlış. 'DateTime'' 2015-10-23T12: 44: 43Z' içeriyorsa ve UTC + 2 saat dilimindeyseniz, 'timestamp'' 2015-10-23 14: 44: 43.0' tuşunu basılı tutar ve elde edilen sonuçtan farklıdır. Çözümdeki çözüm ('2015-10-23 12: 44: 43.0'). – rve

+0

Evet, Timestamp.from (instant) yerel saat diliminize dönüştürüyor gibi görünüyor. Bunu yapmak ve UTC'de kalmasını sağlamak için başka bir yol 'Zaman damgası testi = Zaman damgası.valueOf (entityValue.atZoneSameInstant (ZoneOffset.UTC) .toLocalDateTime());' Yukarıdaki cevabı düzenledim, bunu yansıt. – Notso

+1

Gelecekte başvurmak için yukarıdaki yorumları açıklığa kavuşturmak için: Önceden cevabım Timestamp.from'un (entityValue.toInstant) bunu yapmasını önerdi. Bununla birlikte, anlık bir zaman diliminde esasen anlık bir an olduğu halde, Timestamp.from (aninda), @rve'nin belirttiği gibi yerel saat diliminizde döndürür. Yani, bunu yapmak ve UTC'de kalmasını sağlamak için bir yol 'Zaman damgası testi = Timestamp.valueOf (entityValue.atZoneSameInstant (ZoneOffset.UTC) .toLocalDateTime());' – Notso

2

Kullanım .toEpochSecond() UTC'de), 1000 ile çarpın ve bunu Timestamp yapıcısına iletin (milisaniye beklediği için).

new Timestamp(1000 * offsetDateTime.toEpochSecond()); 
+0

Bu nanosaniye hakkında bilgi kaybedecek olsa - değil mi? – Cheetah

+0

Evet, belki kendi cevabınız daha iyidir. – Glorfindel

3

Başka bir çözüm olacaktır:

Timestamp.valueOf(LocalDateTime.ofInstant(dateTime.toInstant(), ZoneOffset.UTC)); 

O UTC dateTime dönüştürür saat dilimi bilgilerini şeritler ve daha sonra Timestamp sonucu dönüştürür. Hala sarsılmış ama IMHO biraz daha temiz.

Yalnızca toInstance() veya toEpochSeconds() kullanarak, sonucu sağlanan ofset ile ayarlayın.

aşağıdaki sonuçları verir
OffsetDateTime dateTime = 
    OffsetDateTime.of(2015, 10, 23, 12, 44, 43, 0, ZoneOffset.UTC); 
    // OffsetDateTime.of(2015, 10, 23, 12, 44, 43, 0, ZoneOffset.ofHours(-5)); 

err.println("dateTime   = " 
    + dateTime 
); 

err.println("as LocalDateTime = " 
    + dateTime.toLocalDateTime() 
); 

err.println("as timestamp (mine) = " 
    + Timestamp.valueOf(LocalDateTime.ofInstant(dateTime.toInstant(), ZoneOffset.UTC)) 
); 

err.println("@Cheetah (correct) = " 
    + Timestamp.valueOf(dateTime.atZoneSameInstant(ZoneId.of("Z")) 
     .toLocalDateTime()) 
); 

err.println("@Notso (wrong)  = " 
    + Timestamp.from(dateTime.toInstant()) 
); 

err.println("@Glorfindel (wrong) = " 
    + new Timestamp(1000 * dateTime.toEpochSecond()) 
); 

(benim zaman dilimi CET): (NotSo gelen sürüm yukarıdaki

(with ZoneOffset.UTC) 
dateTime   = 2015-10-23T12:44:43Z 
as LocalDateTime = 2015-10-23T12:44:43 
as timestamp (mine) = 2015-10-23 12:44:43.0 
@Cheetah (correct) = 2015-10-23 12:44:43.0 
@Notso (wrong)  = 2015-10-23 14:44:43.0 
@Glorfindel (wrong) = 2015-10-23 14:44:43.0 

(with ZoneOffset.ofHours(-5)) 
dateTime   = 2015-10-23T12:44:43-05:00 
as LocalDateTime = 2015-10-23T12:44:43 
as timestamp (mine) = 2015-10-23 17:44:43.0 
@Cheetah (correct) = 2015-10-23 17:44:43.0 
@Notso (wrong)  = 2015-10-23 19:44:43.0 
@Glorfindel (wrong) = 2015-10-23 19:44:43.0 

oldu

şu bu test sonuçları ve diğer cevaplar gösteriyor 17 Şubat 2016 tarihli yorumundan önce

İlgili konular