【问题标题】:How to change the value new Date() in java如何在java中更改值new Date()
【发布时间】:2020-04-28 00:19:14
【问题描述】:

在我的应用程序中,测试人员测试应用程序时需要经常更改日期和时间。目前,我们必须使用系统命令date-s来更改系统时间,但这会导致服务器上的其他应用程序也受到影响。我想只更改这个应用程序的Date(),我没有想改变应用程序本身,因为使用new Date的地方太多了

【问题讨论】:

  • 您能提供一些背景信息吗?听起来您只需要使用多个日期对象。
  • 那个类 (java.util.Date) 是旧的,不应该(根本)在新代码中使用。话虽如此,我完全不确定你在问什么 - 当前系统日期和时间控制 new Date() 的结果,但我怀疑你知道这一点。
  • 上下文是:@Xu Yanhua 要求能够使 VM 表现得像 1999 年那样,因为为了运行单元测试,他们需要控制时钟。请参阅我的回答,了解如何处理它,而无需采取极端措施,例如弄乱操作系统的系统设置来更新操作系统级别的时钟。

标签: java datetime testing java.util.date


【解决方案1】:

java.util.Date API 非常古老。它被 Calendar API 取代,它也很旧、过时和糟糕,然后又被 java.time API 取代 - 看看 j.u.Date 有多旧?

无论如何,j.u.Date 只是不允许你在这里需要什么。它不支持自定义时钟。

但是java.time 可以

您可以调用:Instant.now(),这是 new Date() 的新 API 等价物(j.u.Date 的名字非常糟糕。它根本不代表日期;它代表时间的瞬间)。有一个变体调用:Instant.now(clock)。这让您可以选择自定义时钟。

安排代码获取要使用的时钟实例,例如通过依赖注入,或者有办法设置它,未设置时钟意味着您默认使用系统时钟 (Clock.systemUTC()),但您可以实现您自己的时钟实例,它确实可以完全满足您的需求:让测试代码“配置”时钟以返回测试所需的任何日期/时间,而完全不需要弄乱您的计算机时钟。

所以,您的三步解决方案:

  1. 消除所有旧 API 的使用:java.text.DateTimeFormatjava.util.Datejava.sql.Timestamp,这些都需要消失。请改用java.time.Instantjava.time.LocalDateTimejava.time.LocalDatejava.time.ZonedDateTime 等(新 API 的类型要多得多,因为时间本质上比 j.u.Date 认为的要复杂;这是那个旧的 API。还要消除对System.currentTimeMillis() 的所有调用。就过时的 API 而言,任何获取“当前时间”的东西都需要删除。

  2. 设置某种依赖注入解决方案(自己编写,或使用现成的解决方案,如 dagger、guice、spring 等),以便注入 Clock 的实例。使用Instant.now(clock) 表单来获取“当前”日期和时间,而不是使用无参数Instant.now()

  3. 实现一个自定义的时钟实现,并使用它来设置代码中查询“当前日期/时间”的所有不同点,以注入这个“测试时钟”。

然后,瞧。测试英灵殿。

【讨论】:

  • 非常感谢,看来我是时候改一下旧代码了。只是难度很大,因为它遍及整个程序。
  • 我发现一个有趣的事情是System.currentTimeMillis()本身是旧的,但是Clock里面还是用的,然后说Clock是新的
  • 在大学时,我使用了 Java 的第一个公开测试版。坦率地说,我讨厌非常非常古老的“非常非常”。我无法反驳。但我很反感。而且我现在感觉非常非常老。感谢那。此外,java.sql.Timestamp 获得通过(但仅限于 DB 层)。一旦他们修复了 JDBC,我们就可以谈论退休Timestamp
  • @Xu 'new API' 倾向于使用'old API'。 System.cTM() 不是“旧 API”,因为它不再起作用:它是 THE 调用以获取系统时钟的当前值。它的“旧”之处在于我们现在知道时间很复杂(例如,您需要自定义时钟进行测试!),因此这种“通过静态方法直接访问”正在走一条您不应该走的捷径:您需要一个介于两者之间的对象 (java.time.Instant),以便您可以放置​​好方法和自定义时钟等逻辑。
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 2017-05-23
  • 2017-08-08
  • 2019-03-13
  • 2021-04-09
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多