首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于NodaTime的Instant.Now

用于NodaTime的Instant.Now
EN

Stack Overflow用户
提问于 2013-01-26 06:55:07
回答 2查看 17K关注 0票数 38

我正在尝试掌握Jon Skeet (和其他人)使用Noda Time框架的方法。

我正在尝试存储当前(Instant)。Instant是由一个长的刻度创建的,但是现在的刻度是多少呢?

是不是:

代码语言:javascript
复制
Instant now = new Instant(DateTime.Now.ToUniversalTime().Ticks);

或者呢?

代码语言:javascript
复制
Instant now = Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime());

它们是等价的吗,我这样做是对的吗?

另外,如果Jon的回答是这样--我想提出一个Instant.Now属性。

PS2我知道标题包含一个标签,但它不会让我有一个简短的"Instant.Now“标题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 51
EN

Stack Overflow用户

发布于 2013-01-26 07:23:29

SystemClock.NowInstant值的形式返回当前时间:

代码语言:javascript
复制
Instant now = SystemClock.Instance.Now;

但您可能需要注意IClock接口文档中的说明:

IClock旨在用于您需要访问当前时间的任何地方。尽管严格来说,直接调用SystemClock.Instance.Now并不是不正确的,就像您可能调用UtcNow一样,但作为产品代码的风格问题,强烈建议您这样做。我们建议向任何需要它的人提供一个IClock实例,这允许您使用NodaTime.Testing程序集中的存根时钟(或您自己的实现)编写测试。

举个简单的例子,假设您有一个需要当前时间的Logger类。使用通过其构造函数提供的IClock实例,而不是直接访问SystemClock

代码语言:javascript
复制
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

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14531627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档