如何将 LocalDateTime 转换为 com.google.protobuf.Timestamp?



我有一个从存储库层获得的LocalDateTime实例,我需要将其转换为时间戳(协议缓冲区(实例。

我已经习惯了以下转换方法:

LocalDateTime localDateTime = LocalDateTime.now();//this can be any date
Instant instant = localDateTime.toInstant(ZoneOffset.UTC);
Timestamp timestamp = Timestamp.newBuilder()
.setSeconds(instant.getEpochSecond())
.setNanos(instant.getNano())
.build();

这里使用的 ZoneOffset 是否用于将 localDateTime 转换为 Instant 的实例,正确吗?

我使用了 UTC 偏移量,因为时间戳类中"秒"属性的注释如下:

表示自 Unix 纪元 1970-01-01T00:00:00Z 以来的 UTC 时间秒数。 必须从 0001-01-01T00:00:00Z 到 9999-12-31T23:59:59Z(含

(

我是否使用了正确的区域偏移量,我的转换方法是否正确?

一般来说,不,你的方法不正确。原因是LocalDateTime没有关联的时区,因此本质上是模棱两可的。要将其转换为实际时间戳(与时区无关的绝对时间点(,您需要知道它是在哪个时区中测量的。

通过调用localDateTime.toInstant(ZoneOffset.UTC),您假设您的localDateTime实际上是在 UTC 时区测量的。相反,您应该使用存储LocalDateTime的时区。如果您不知道,那么您的输入数据本质上是不明确的,您需要先修复它。

请注意,这与 Unix 纪元通常以 UTC 指定的事实无关。我们不妨说Unix时代是1970-01-01T08:00:00+08:00,而且是同一时刻。

其余的对我来说似乎是正确的。

这是一个例程,将问题的评论和这个问题的实际答案放在一起:

protected Timestamp convertLocalDateTimeToGoogleTimestamp(LocalDateTime localDateTime) {
Instant instant = localDateTime.toInstant(ZoneOffset.UTC);
Timestamp result = Timestamp.newBuilder()
.setSeconds(instant.getEpochSecond())
.setNanos(instant.getNano())
.build();
return result;
}
LocalDateTime localDateTime = LocalDateTime.now();//this can be any date
Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
Timestamp timestamp = Timestamp.newBuilder()
.setSeconds(instant.getEpochSecond())
.setNanos(instant.getNano())
.build();

试试这个:

Timestamp currentTimeStamp =   Timestamps.fromMillis(System.currentTimeMillis());

相关内容

最新更新