protobuf timestamp:使用Java 8 time.Instant

时间:2018-01-19 15:16:53

标签: java protocol-buffers

我使用的是protobuf,我的其中一条消息使用google.protobuf.Timestamp类型。

生成Java代码时,生成的protobuf类使用com.google.protobuf.Timestamp

有没有办法告诉protobuf使用新的Java 8类型(例如time.Instant)?在我使用protobuf的任何地方,我都不希望类型转换混乱我的代码。理想情况下,它是在生成的代码本身内完成的。

4 个答案:

答案 0 :(得分:6)

Instant instant = Instant.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos());

答案 1 :(得分:1)

不确定是否可以根据需要选择使世代生成的选项,但是最好的方法是在此处查看gRPC文档:

https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/util/Timestamps

并选择最适合您的。 例如:

Instant anInstant = Instant.ofEpochMilli(com.google.protobuf.util.Timestamps.toMillis(someGoogleProtobufTimestamp));

正确导入后,看起来会更短,更漂亮(仅显示示例中使用的软件包)

答案 2 :(得分:0)

Protobuf时间戳只是秒的int64和nanos的int32。 来自https://github.com/google/protobuf/blob/master/src/google/protobuf/timestamp.proto

message Timestamp {

  // Represents seconds of UTC time since Unix epoch
  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
  // 9999-12-31T23:59:59Z inclusive.
  int64 seconds = 1;

  // Non-negative fractions of a second at nanosecond resolution. Negative
  // second values with fractions must still have non-negative nanos values
  // that count forward in time. Must be from 0 to 999,999,999
  // inclusive.
  int32 nanos = 2;
}

所以你应该能够通过以下方式转换为Instant:

Timestamp protoTimestamp = ....
Instant instant = Instant.ofEpochMilli(protoTimestamp.getSeconds() * 1000);

答案 3 :(得分:0)

如果有人用Kotlin写作,Louis' answer可以实现为如下扩展功能:

fun Timestamp.toInstant(): Instant = Instant.ofEpochSecond(seconds, nanos.toLong())

那么您就可以myProto.myTimestampField.toInstant()