java 如何将本地日期时间转换为com.google.protobuf.时间戳?

9avjhtql  于 2023-03-06  发布在  Java
关注(0)|答案(4)|浏览(360)

我有一个LocalDateTime的示例,它是从存储库层获得的,我需要将它转换为一个Timestamp(Protocol Buffer)示例。
我已经习惯了以下转换方法:

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类中“seconds”属性的注解如下:
表示自Unix纪元1970-01- 01 T00:00:00 Z以来的UTC时间秒数。必须介于0001-01- 01 T00:00:00 Z和9999-12- 31 T23:59:59 Z之间(含)
我是否使用了正确的ZoneOffset?我的转换方法是否正确?

pqwbnv8z

pqwbnv8z1#

一般来说,你的方法是不正确的,原因是LocalDateTime没有关联的时区,所以它本质上是不明确的。要将它转换成实际的时间戳(绝对时间点,独立于时区),你需要知道它是在哪个时区测量的。
通过调用localDateTime.toInstant(ZoneOffset.UTC),您假设您的localDateTime实际上是在UTC时区测量的。**相反,您应该使用存储LocalDateTime的时区。**如果您不知道,则您的输入数据本质上是不明确的,您需要首先解决这个问题。
请注意,这与Unix纪元通常是以UTC指定的事实无关,我们不妨说Unix纪元是1970-01-01T08:00:00+08:00,并且它将是时间上的同一时刻。
剩下的我觉得是对的。

bz4sfanl

bz4sfanl2#

下面是一个例程,它将问题和actual answer中的注解合并到这个问题中:

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

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

    return result;
  }
ibps3vxo

ibps3vxo3#

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();
x0fgdtte

x0fgdtte4#

试试这个:

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

相关问题