传递一个Clock 实现
Answer by Jonathan 是正确的。 Clock 类提供了几个说谎的替代实现,以方便测试。以下是如何使用它们的更多说明。
java.time 中的每个now 方法都采用可选的Clock 参数。
代表时刻的类:
类不代表一个时刻:
如果省略,您将获得系统默认的Clock 实现,即真正的时钟。
Clock 类提供了几个方便的替代实现,可通过调用静态类方法获得。请参阅 my Answer on a similar Question 以获取带有描述的列表。
如果您想用假时钟覆盖该真时钟以进行测试,请通过其他一些Clock 实现。
例如,我们制作了一个Clock,它错误地报告了一个固定的时刻,一个不“滴答”的时钟。我们将这一时刻设置为从现在起两个小时后。
Clock twoHoursFuture =
Clock.fixed(
Instant.now().plus( Duration.ofHours( 2 ) ) , // Capture the current moment, then add a `Duration` span-of-time of two hours. Result is a moment in the future.
ZoneId.systemDefault() // Or specify another time zone if that is an aim of your testing.
)
;
给定一些代码,例如这个方法:
public void someMethod( Clock clock ) {
…
ZonedDateTime zdt = ZonedDateTime.now( clock ) ;
…
}
...您的测试工具通过了错误的时钟:
// Test harness passes `twoHoursFuture`.
someObject.someMethod( twoHoursFuture ) ;
...当您的生产代码通过真正的时钟时,通过调用Clock.systemDefaultZone() 获得:
// Production-code passes the result of calling `Clock.systemDefaultZone()`.
someObject.someMethod( Clock.systemDefaultZone() ) ;
关于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 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。