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

2022-09-04 22:41:44

我有一个 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 偏移量,因为 Timestamp 类中“秒”属性的注释显示以下内容:

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

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


答案 1

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

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

请注意,这与Unix时代通常以UTC形式指定的事实无关。我们也可以说Unix时代是,它将是相同的时刻。1970-01-01T08:00:00+08:00

其余的在我看来是正确的。


答案 2

下面是一个例程,它将问题的评论和对此问题的实际答案放在一起:

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

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

    return result;
  }

推荐