将OffsetDateTime转换为UTC时间戳

我有一个java.time.OffsetDateTime ,我想将其转换为java.sql.Timestamp 。 由于Timestamp不存储任何偏移信息,因此我将以UTC格式存储数据库中的所有日期/时间。

如何将OffsetDateTime转换为UTC OffsetDateTimeTimestamp

编辑:

我相信这是答案,但似乎是转向UTC的相当复杂的方式:

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

这将是一种进行转换并确保使用UTC的方法。 我认为比使用纪元秒提出的解决方案更清晰。

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

另一种解决方案是:

 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日编辑之前)

使用.toEpochSecond()从参考日期(以UTC为单位.toEpochSecond()获取秒数,乘以1000并将其传递给Timestamp构造函数(因为它需要毫秒)。

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