Java 用于获取系统时间的代理对象

Java 用于获取系统时间的代理对象,java,guava,Java,Guava,在番石榴中有一个非常酷的概念。不幸的是,它似乎是围绕着产生纳秒聚焦秒表来测量执行时间而设计的 我想找到这样的东西,因为它使测试类对时间变化敏感变得更容易。我在使用System.currentTimeMillis()时遇到过一个问题,因为在测试中很难模拟时间的流逝。我在考虑使用一个与Guava类似的界面,但是用毫秒来测量时间,因为它匹配更多的可用库 在我自己写之前,我想问问是否有人看过类似的东西或有其他建议。编辑:经过进一步思考,我喜欢克里斯托夫和科林的建议。为挂钟提供类似功能的想法会很好 正如所

在番石榴中有一个非常酷的概念。不幸的是,它似乎是围绕着产生纳秒聚焦秒表来测量执行时间而设计的

我想找到这样的东西,因为它使测试类对时间变化敏感变得更容易。我在使用
System.currentTimeMillis()
时遇到过一个问题,因为在测试中很难模拟时间的流逝。我在考虑使用一个与Guava类似的界面,但是用毫秒来测量时间,因为它匹配更多的可用库


在我自己写之前,我想问问是否有人看过类似的东西或有其他建议。

编辑:经过进一步思考,我喜欢克里斯托夫和科林的建议。为挂钟提供类似功能的想法会很好


正如所指出的,这里最好的策略可能只是实现一种方法,该方法将读取一毫秒的时间

正如您所指出的,
Ticker
用于测量经过的时间(System.nanoTime()用于测量时间),而不是挂钟时间(System.currentTimeMillis()用于测量时间),您不应该使用它来获取时间


我建议创建一个抽象的
Clock
类,类似于
Ticker
,但用于获取以毫秒为单位的挂钟时间。

这就是我在项目中使用的:

public interface Clock {
    LocalDate today();
    LocalTime time();
    LocalDateTime now();
    long timestamp();
}
正如您所说,它使单元测试变得更简单(甚至可能)。我有一个总是返回真实时间的实现和一个我可以控制的
FakeClock
。它的实现是如此简单,你可以轻松地推出自己的-我认为在番石榴中没有类似的东西


此方法也在。

Wait中介绍和推荐。除了以毫秒为单位测量时间外,您还需要一个<代码>自动售票机?从纳秒转换成纳秒是个问题,有什么特别的原因吗?@NickCampion:这不是个坏问题。见我的答案。谢谢你的反馈,科林。即使你们说了同样的话,我还是要给克里斯托夫一个“答案”,因为我最终使用了他定义的精确时钟。如果我能记下两个答案,你会是#2:)不幸的是,我还决定使用乔达时间,所以我的时钟没有意义再回到番石榴。真糟糕。谢谢你的想法和参考书,看起来很有趣。