tl;博士
时区与经过的小时-分钟-秒无关。
Duration.between(
Instant.parse( "2017-12-14T01:34:56.123456789Z" ) ;
Instant.now()
)
java.time
现代方法使用行业领先的 java.time 类。这些取代了麻烦的旧旧日期时间类,例如 Date 和 Calendar。
服务器通常应设置为 UTC 时区。你永远不应该依赖任何这样的设置。相反,您的代码应指定所需/预期的时区。
作为一般规则,您的业务逻辑、数据存储和数据交换都应该使用 UTC。序列化为文本时,仅使用标准 ISO 8601 格式。
在必要时应用其他时区,如用户在用户界面中所期望的那样。因此,通常您应该将 UTC 以外的时区视为本地化问题。
Instant
Instant 类代表一个时刻,即 UTC 时间轴上的一个点,分辨率为纳秒。获取当前时刻不受时区设置的影响。
Instant instant = Instant.now() ;
通过调用toString序列化为标准格式的文本。
String output = instant.toString() ;
您可以将Instant 与您的数据库交换。
myPreparedStatement.setObject( … , instant ) ;
……和……
Instant instant = myPreparedStatement.getObject( … , Instant.class ) ;
ZonedDateTime
申请ZoneId 以获得ZonedDateTime。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
要生成非标准格式的字符串,请使用DateTimeFormatter 类。在 Stack Overflow 上搜索许多示例和讨论。
Duration
要获取经过的小时数、分钟数、秒数,请使用 Duration 类。请注意,您不需要时区来表示已用时间; UTC (Instant) 给出相同的结果。
Duration d = Duration.between( then , Instant.now() ) ;
对于早期的 Android,请参阅 ThreeTen-Backport 和 ThreeTenABP 项目。见How to use…。
关于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 类?