Java 8 中有 setCurrentMillisFixed 吗?

Do we have setCurrentMillisFixed in Java 8?

在 Joda 中,我们有 setCurrentMillisFixed 方法,可用于设置当前系统时间:

DateTimeUtils.setCurrentMillisSystem();

在 Java 8 我正在尝试 :

ZonedDateTime.now(Clock.systemDefaultZone());

但是很多测试用例都失败了,我猜这与日期的设置方式有关。

同样,对于快进时间,在 Joda

DateTimeUtils.setCurrentMillisFixed(theFuture);

在 Java 8 我试过:

ZonedDateTime.now().toInstant().plusMillis());

我是不是做错了什么?

Clock 有多种变体,您可以使用 Clock.fixed(...) 始终 return 指定的瞬间。

通过 Clock 实施

是正确的。 Clock class 提供了几个 说谎的替代实现 ,以方便测试。这里有更多关于如何使用它们的解释。

java.time 中的每个 now 方法都有一个可选的 Clock 参数。

代表一个时刻的classes:

class是不是代表的时刻:

如果省略,您将获得系统默认的 Clock 实现,即真正的时钟。

Clock class 提供了几个方便的替代实现,可通过调用静态 class 方法获得。有关说明列表,请参阅 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 framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

您可以直接与数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* classes.

从哪里获得java.time classes?

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.