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

une*_*q95 5 java protocol-buffers java-8

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

我习惯了以下转换方法:

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();
Run Code Online (Sandbox Code Playgroud)

是否在这里使用ZoneOffset来将localDateTime转换为Instant实例,对吗?

我使用了UTC偏移量,因为在Timestamp类中对“ seconds”属性的注释如下:

表示自Unix时代1970-01-01T00:00:00Z以来的UTC时间的秒数。必须介于0001-01-01T00:00:00Z至9999-12-31T23:59:59Z(含)

我是否使用了正确的ZoneOffset,并且转换方法正确吗?

Tho*_*mas 7

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

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

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

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


Bra*_*rks 5

以下例程将问题的评论和该问题的实际答案汇总在一起:

 protected Timestamp convertLocalDateTimeToGoogleTimestamp(LocalDateTime localDateTime) {
    Instant instant = localDateTime.toInstant(ZoneOffset.UTC);

    Timestamp result = Timestamp.newBuilder()
            .setSeconds(instant.getEpochSecond())
            .setNanos(instant.getNano())
            .build();

    return result;
  }
Run Code Online (Sandbox Code Playgroud)