另一解決方案是:
Timestamp.valueOf(LocalDateTime.ofInstant(dateTime.toInstant(), ZoneOffset.UTC));
它轉換dateTime
爲UTC,剝去時區信息,然後將結果提供給轉換Timestamp
。它仍然令人費解,但恕我直言,它有點乾淨。
只是使用toInstance()
或toEpochSeconds()
將調整以偏移提供的結果。
以下顯示這個測試結果和其他答案:
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())
);
它的結果如下(我的時區是CET):
(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
(從Notso版本上面他2016年2月17日)的編輯之前
來源
2016-02-16 13:08:08
rve
這是錯誤的。如果'dateTime'包含'2015-10-23T12:44:43Z',你在時區UTC + 2,那麼'timestamp'將舉行'2015年10月23日14:44:43.0'並從所提供的結果不同答案中的解決方案('2015-10-23 12:44:43.0')。 – rve
是的,Timestamp.from(即時)確實會將其轉換爲您當地的時區。另一種方式來做到這一點,確保它保持在UTC是「時間戳測試= Timestamp.valueOf(entityValue.atZoneSameInstant(ZoneOffset.UTC).toLocalDateTime());」我編輯了上面的答案反映了這一點。 – Notso
澄清上述評論以備將來參考:以前我的回答指出Timestamp.from(entityValue.toInstant)會這樣做。然而,雖然瞬時基本上是從時代開始的時間軸上的瞬間,但時間戳(從瞬時)返回到當地時區,如@rve所述。因此,一種實現這一點並確保它仍然在UTC的方式是'Timestamp test = Timestamp.valueOf(entityValue.atZoneSameInstant(ZoneOffset.UTC).toLocalDateTime());' – Notso