如何在java中更改值new Date()

如何在java中更改值new Date(),java,datetime,testing,java.util.date,Java,Datetime,Testing,Java.util.date,在我的应用程序中,当测试人员测试应用程序时,需要频繁更改日期和时间。目前,我们必须使用系统命令date-s来更改系统时间,但这将导致服务器上的其他应用程序也受到影响。我只想更改此应用程序的日期(),不想更改应用程序本身,因为有很多地方使用了新的日期,java.util.DateAPI非常古老。它被CalendarAPI所取代,后者同样陈旧、过时、糟糕,而这反过来又被java.timeAPI所取代-查看j.u.Date有多旧 无论如何,j.u.Date就是不允许你在这里需要什么。它不支持自定义时钟

在我的应用程序中,当测试人员测试应用程序时,需要频繁更改日期和时间。目前,我们必须使用系统命令date-s来更改系统时间,但这将导致服务器上的其他应用程序也受到影响。我只想更改此应用程序的日期(),不想更改应用程序本身,因为有很多地方使用了新的日期,
java.util.Date
API非常古老。它被
Calendar
API所取代,后者同样陈旧、过时、糟糕,而这反过来又被
java.time
API所取代-查看
j.u.Date
有多旧

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

但是
java.time

您可以调用:
Instant.now()
,这是新的API,相当于
new Date()
(j.u.Date的名称非常糟糕。它根本不表示日期;它表示时间上的瞬间)。有一个变量调用:
Instant.now(时钟)
。这使您可以选择自定义时钟

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

因此,您的三步解决方案:

  • 消除所有旧API的使用:
    java.text.DateTimeFormat
    java.util.Date
    java.sql.Timestamp
    ,这些都需要删除。改为使用
    java.time.Instant
    java.time.LocalDateTime
    java.time.LocalDate
    java.time.ZonedDateTime
    ,等等(新API有更多的类型,因为时间本质上比
    j.u.Date
    所认为的更复杂;它是旧API的众多缺陷之一。同时也消除了对
    System.currentTimeMillis()
    的所有调用。任何以过时API表示的“当前时间”都需要删除

  • 设置某种依赖项注入解决方案(自己编写,或者使用dagger、guice、spring等现成的解决方案),这样就可以注入时钟实例。使用
    Instant.now(Clock)
    表单获取“当前”日期和时间,而不要使用参数较少的
    Instant.now()

  • 实现一个定制的impl-of-clock,并使用它来设置代码中查询“当前日期/时间”以注入该“测试时钟”的所有不同点


  • 那么,瞧,Test valhalla。

    您能给出一些上下文吗?听起来您只需要使用多个date对象。该类(
    java.util.date
    )很旧,不应该使用(根本不应该使用)在新代码中。也就是说,我根本不确定你在问什么-当前系统日期和时间控制什么
    newdate()
    结果是,但我怀疑你知道。上下文是:@Xu Yanhua要求能够让虚拟机像1999年那样运行,因为为了运行单元测试,他们需要控制时钟。请看我的答案,了解如何操作,而不必采取诸如干扰操作系统设置之类的激烈措施来更新系统操作系统级别的时钟。这回答了你的问题吗?非常感谢,现在似乎是我更改旧代码的时候了。这只是一个很大的困难,因为它遍布整个程序。我发现一个有趣的东西是System.currentTimeMillis()它本身是旧的,但它仍然在时钟内部使用,然后说时钟是新的。在大学里,我使用了Java的第一个公开测试版。坦率地说,我讨厌非常非常旧的测试版中的“非常非常”。我不能反驳它。但我讨厌它。我现在感觉非常非常老。谢谢你。而且,
    Java.sql.Timestamp
    获得通过(但只在DB层)。一旦他们修复了JDBC,我们就可以谈论退役
    Timestamp
    @Xu“新API”倾向于使用“旧API”。System.cTM()不是“旧API”,因为它不再工作:它是用来获取系统时钟当前值的调用。它的“旧”之处在于我们现在知道时间是复杂的(例如,您需要自定义时钟进行测试!),因此这种“通过静态方法直接访问”采用了一种您不应该采用的快捷方式:您需要一个介于两者之间的对象(java.time.Instant),这样您就有了放置好方法和逻辑(如自定义时钟)的位置。