我正在尝试掌握Jon Skeet (和其他人)使用Noda Time框架的方法。
我正在尝试存储当前(Instant)。Instant是由一个长的刻度创建的,但是现在的刻度是多少呢?
是不是:
Instant now = new Instant(DateTime.Now.ToUniversalTime().Ticks);或者呢?
Instant now = Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime());它们是等价的吗,我这样做是对的吗?
另外,如果Jon的回答是这样--我想提出一个Instant.Now属性。
PS2我知道标题包含一个标签,但它不会让我有一个简短的"Instant.Now“标题。
发布于 2013-01-26 07:24:13
我做了一些研究,根据clock的说法,NodaTime的方式似乎是获取now时刻。
如果您想使用系统时钟获取当前时间,只需使用SystemClock.Instance.GetCurrentInstant()。
但是,最好在时间感知类中注入IClock依赖项,而不是直接在代码中使用SystemClock.Instance。
这将允许您:
SystemClock.Instance,因此代码将使用正确的时间IClock实现,以允许您根据需要调整时间以测试各种场景(如时间的流逝)。有一个名为FakeClock.的NodaTime.Testing项目提供了这样一个类
我发现这非常有用。我认为让像new Instant()或Instant.Now这样的东西返回当前时间会更容易在幕后硬编码SystemClock的用法,从而错过了NodaTime提供的测试优势。
有关使用NodaTime进行单元测试的更多信息,请参阅this link。
关于你的代码示例:它们是不等价的。
Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime())确实会给你当前的时间,UTC.new Instant(DateTime.Now.ToUniversalTime().Ticks)会给你一个错误的日期,因为here).的DateTime.Ticks表示自1/1/0001以来的刻度数,而NodaTime的Instant.Ticks表示自1/1/1970以来的刻度数(请参阅备注NodaTime
发布于 2013-01-26 07:23:29
SystemClock.Now以Instant值的形式返回当前时间:
Instant now = SystemClock.Instance.Now;但您可能需要注意IClock接口文档中的说明:
IClock旨在用于您需要访问当前时间的任何地方。尽管严格来说,直接调用
SystemClock.Instance.Now并不是不正确的,就像您可能调用UtcNow一样,但作为产品代码的风格问题,强烈建议您这样做。我们建议向任何需要它的人提供一个IClock实例,这允许您使用NodaTime.Testing程序集中的存根时钟(或您自己的实现)编写测试。
举个简单的例子,假设您有一个需要当前时间的Logger类。使用通过其构造函数提供的IClock实例,而不是直接访问SystemClock:
public class Logger
{
private readonly IClock clock;
public Logger(IClock clock)
{
this.clock = clock;
}
public void Log(string message)
{
Instant timestamp = this.clock.Now;
// Now log the message with the timestamp...
}
}当您在生产代码中实例化一个Logger时,您可以赋予它SystemClock.Instance。但是在Logger类的单元测试中,您可以给它一个FakeClock。
https://stackoverflow.com/questions/14531627
复制相似问题