【问题标题】:Do we have setCurrentMillisFixed in Java 8?我们在 Java 8 中有 setCurrentMillisFixed 吗?
【发布时间】:2018-12-25 03:23:42
【问题描述】:

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

DateTimeUtils.setCurrentMillisSystem();

在 Java 8 中我正在尝试:

ZonedDateTime.now(Clock.systemDefaultZone());

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

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

DateTimeUtils.setCurrentMillisFixed(theFuture);

在 Java 8 中我尝试过:

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

我做错了吗?

【问题讨论】:

标签: java-8 zoneddatetime


【解决方案1】:

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

【讨论】:

  • Clock.fixed(Instant.now(), ZoneId.systemDefault()); 这够了吗?还是我必须将其传递给 ZonedDatetime ?
  • 添加几秒钟:ZonedDateTime.now(Clock.fixed(Instant.now().plusMillis(1000), ZoneId.systemDefault()));
  • 仍然没有运气,基本上我认为当我们做DateTimeUtils.setCurrentMillisFixed(theFuture); 时,我们设定了一个未来的日期,我尝试了很多方法,但无法使用 Java 8 完成
【解决方案2】:

传递一个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.DateCalendarSimpleDateFormat

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 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2017-05-09
    相关资源
    最近更新 更多