39

Jon Skeet (およびその他) によるNoda Timeフレームワークの使用方法を理解しようとしています。

現在(インスタント)を保存しようとしています。インスタントは長いティックから作成されますが、現在のティックの現在のカウントは何ですか?

それは...ですか:

Instant now = new Instant(DateTime.Now.ToUniversalTime().Ticks);

そして、または?

Instant now = Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime());

それらは同等ですか、私はこれを正しくやっていますか?

PS、Jon の回答がこれなら、Instant.Now プロパティを提案したいと思います。

PS2 タイトルにタグが含まれていることは知っていますが、「Instant.Now」という短いタイトルを付けることはできません。

4

2 に答える 2

52

少し調べてみたところ、NodaTime の方法は、時計に従って現在の瞬間を取得することのようです。

システム クロックを使用して現在の時刻を取得する場合は、単にSystemClock.Instance.GetCurrentInstant().

ただし、コードで を直接使用する代わりに、時間対応クラスに依存関係SystemClock.Instanceを挿入することをお勧めします。IClock

これにより、次のことが可能になります。

  • 実行時にクラスに提供するSystemClock.Instanceため、コードは正しい時間を使用します
  • IClockさまざまなシナリオ (時間の経過など) をテストするために、必要に応じて時間を微調整できるように、ユニット テスト中に偽の実装を提供します。と呼ばれるそのようなクラスを提供する NodaTime.Testing プロジェクトがありますFakeClock

これはとても便利だと思います。現在の時刻のようなものnew Instant()Instant.Now現在の時刻を返すと、カバーの下での使用をハードコーディングしやすくなりSystemClock、NodaTime が提供するテストの利点が失われると思います。

NodaTime を使用した単体テストの詳細については、このリンクを参照してください。


あなたのコード例に関して:それらは同等ではありません。

  • Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime())実際にUTCで現在の瞬間を提供します。
  • new Instant(DateTime.Now.ToUniversalTime().Ticks)BCL は からのティック数を表し、NodaTimeDateTime.Ticksは からのティック数を表すため、遠い将来の間違った日付が返されます(ここのコメントを参照)。1/1/0001Instant.Ticks1/1/1970
于 2013-01-25T23:24:12.707 に答える
18

SystemClock.NowInstant現在の時刻を値として返します。

Instant now = SystemClock.Instance.Now;

IClockただし、インターフェイスのドキュメントにある注意事項に注意することをお勧めします。

IClockは、現在の時刻にアクセスする必要がある場所で使用することを目的としています。UtcNowSystemClock.Instance.Nowを呼び出すのと同じように、直接呼び出すことは厳密に間違っているわけではありませんが、運用コードのスタイルの問題として強くお勧めできません。これにより、 NodaTime.Testingアセンブリ (または独自の実装) でスタブ クロックを使用してテストを記述できるようになります。

簡単な例として、Logger現在の時刻を必要とするクラスがあるとします。SystemClock直接アクセスする代わりにIClock、コンストラクターを介して提供されるインスタンスを使用します。

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.InstanceLoggerしかし、クラスの単体テストでは、 FakeClock.

于 2013-01-25T23:23:29.073 に答える