我使用的是protobuf,我的其中一条消息使用google.protobuf.Timestamp
类型。
生成Java代码时,生成的protobuf类使用com.google.protobuf.Timestamp
。
有没有办法告诉protobuf使用新的Java 8类型(例如time.Instant
)?在我使用protobuf的任何地方,我都不希望类型转换混乱我的代码。理想情况下,它是在生成的代码本身内完成的。
答案 0 :(得分:6)
Instant instant = Instant.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos());
答案 1 :(得分:1)
不确定是否可以根据需要选择使世代生成的选项,但是最好的方法是在此处查看gRPC文档:
并选择最适合您的。 例如:
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()