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
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
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
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