java.time
避免使用 JSR 310 遗留下来的糟糕的日期时间类。现在已被现代 java.time 类所取代。
您可以轻松地来回转换。调用添加到旧类的新转换方法。
Instant instant = myJavaUtilDate.toInstant() ;
然后又回来了。
java.util.Date myJavaUtilDate = Date.from( instant ) ;
减去一毫秒。
Instant oneMilliEarlier = instant.minusMillis( 1 ) ;
半开
但我建议你不要采用这种方法。不要在最后一刻跟踪时间跨度。
您尝试跟踪一天中的最后一刻是有问题的。你正在失去最后一毫秒的时间。这样做会留下一个空白,直到第二天的第一刻。当切换到更精细的时间切片时,例如某些系统(如 Postgres 等数据库)使用的微秒,以及其他软件(如 java.time 类使用的纳秒),您会遇到更严重的问题。
更好的方法是日期时间处理中常用的半开方法。时间跨度的开始是包含,而结束是不包含。
所以一整天从一天的第一刻开始,通常是 00:00:00(但并非总是如此!),一直持续到但不包括下一个 一天。
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
ZonedDateTime start = zdt.toLocalDate().atStartOfDay( z ) ;
ZonedDateTime stop = start.plusDays( 1 ) ;
提示:要处理这样的时间跨度,请添加 ThreeTen-Extra 库以访问 Interval 类。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。