java - 如何将 Google proto 时间戳转换为 Java LocalDate?

标签 java date grpc grpc-java proto

我们需要将 Google Proto 缓冲区时间戳转换为正常日期。在这种情况下,有没有办法将 Google Proto 缓冲区时间戳直接转换为 Java LocalDate

最佳答案

tl;dr

作为 UTC 时刻,转换为 java.time.Instant。然后应用时区以获得 ZonedDateTime。将仅限日期的部分提取为 LocalDate

一行:

Instant
.ofEpochSecond( ts.getSeconds() , ts.getNanos() ) 
.atZone( ZoneId.of( "America/Montreal" ) ) 
.toLocalDate() 

转换

第一步是转换 Timestamp对象的秒数和小数秒(纳秒)到 java.time 类。具体来说,java.time.Instant .就像 Timestamp 一样,Instant 表示 UTC 中的一个时刻,分辨率为纳秒。

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

确定日期需要时区。对于任何给定时刻,日期在全局范围内因地区而异。

ZoneId 应用于我们的 Instant 以获得 ZonedDateTime。同一时刻,时间轴上的同一点,不同的挂钟时间。

ZoneId z = ZoneId( "Pacific/Auckland" ) ; 
ZonedDateTime zdt = instant.atZone( z ) ;

将仅限日期的部分提取为 LocalDateLocalDate 没有时间和时区。

LocalDate ld = zdt.toLocalDate() ;

警告:不要为此目的使用LocalDateTime 类,不幸的是,如另一个答案所示。该类故意缺少任何时区或与 UTC 的偏移量的概念。因此它不能代表一个时刻,不是时间轴上的一个点。请参阅类文档。

转换

最好完全避免非常麻烦的遗留日期时间类,包括 DateCalendarSimpleDateFormat。但是,如果您必须与尚未更新到 java.time 的旧代码进行互操作,您可以来回转换。调用添加到旧类的新转换方法。

GregorianCalendar gc = GregorianCalendar.from( zdt ) ;

要将仅限日期的值表示为 GregorianCalendar,我们必须指定时间和时区。您可能希望使用一天中的第一时刻作为一天中的时间组件。永远不要假设第一时刻是 00:00:00。夏令时等异常意味着第一时刻可能是另一个时间,例如 01:00:00。让 java.time 确定第一个时刻。

ZonedDateTime firstMomentOfDay = ld.atZone( z ) ;
GregorianCalendar gc = GregorianCalendar.from( firstMomentOfDay ) ;

Table of date-time types in Java (both legacy and modern) and in standard SQL


关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

您可以直接与您的数据库交换java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 如何将 Google proto 时间戳转换为 Java LocalDate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52645487/

相关文章:

java - 如何使用远程服务器上的mysql数据库创建连接池?

java - 有启动远程 JVM 的替代方法吗?

bash - 如何评估docker-compose.yml文件中的动态变量?

nginx - grpc_send_timeout 不起作用,Nginx 意外关闭 GRPC 流

java - 将 Intellij 与 Spring-Data-Neo4j/w Aspectj 一起使用会在尝试创建 Repos 时出现 Java 错误

java - 如何测量点击之间的时间?

javascript - 验证 JS 中开放时间之间的日期

javascript - 在javascript中格式化日期

java - 使用 Protobuf 类与在 Java 中使用映射框架/层

protocol-buffers - go-micro 和 go-grpc 的区别