因此经过一些搜索,建议使用int64
时代。
这一切都很好,但在与我的模型交互时,我想与实际的LocalDate
对象进行交互,那么处理这个对象的策略是什么?
我能想到的两个策略是:
这里的常见做法是什么?
答案 0 :(得分:8)
我选择为所有日期/时间创建通用解决方案:
message Timestamp {
int64 seconds = 1;
int32 nanos = 2;
}
使用以下转换器:
public static Timestamp fromLocalDate(LocalDate localDate) {
Instant instant = localDate.atStartOfDay().toInstant(ZoneOffset.UTC);
return Timestamp.newBuilder()
.setSeconds(instant.getEpochSecond())
.setNanos(instant.getNano())
.build();
}
public static LocalDate toLocalDate(Timestamp timestamp) {
return LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos()), ZoneId.of("UTC"))
.toLocalDate();
}
答案 1 :(得分:2)
无需创建自己的Timestamp版本。
您只需使用google.protobuf.Timestamp
(source):
import "google/protobuf/timestamp.proto";
message Application {
google.protobuf.Timestamp date = 1;
}
它是创建Date
个对象的标准(proto)方式。
使用新的Java8时间API将Instant
转换为google.Timestamp
很容易
LocalDate date = ...;
final Instant instant = java.sql.Timestamp.valueOf(date.atStartOfDay()).toInstant();
Timestamp t = Timestamp.newBuilder().setSeconds(instant.getEpochSecond()).build();
请注意,Google已为Timestamp
建立了一个帮助:
答案 2 :(得分:1)
您永远不应该编辑生成的代码。这是一个坏主意的众多原因,您编辑的代码可能无法与未来版本的Protobuf库一起使用。
通常,从int64
转换为某种Date
对象很便宜。我建议将数据保留为int64
格式,并且只在需要时按需构建LocalDate
对象。
也就是说,通常的做法是维护一个单独的手写模型,并且只在解析/序列化时使用Protobuf类。