2015-01-09 7 views
9

"today"を表すLocalDateインスタンスを作成するための推奨方法は何ですか? LocalDateクラスに静的な "Now"または "Today"プロパティが存在することを期待していましたが、そうではありません。私の現在のアプローチは、DateTime.Nowを使用することです:"today"を表すNodaTime LocalDateを作成します。

var now = DateTime.Now; 
LocalDate today = new LocalDate(now.Year, now.Month, now.Day); 

良い方法はありますか?

答えて

15

まず「今日」と答えると、世界中のさまざまな人々の答えが異なる可能性があります。したがって、現在のローカル日付を取得するには、タイムゾーンが必要です。

システム時刻などのIClockからNowに電話すると、Instantが正しく入力されます。インスタントは普遍的なので、タイムゾーンのローカル日付を取得するには、それをいくつかのタイムゾーンに変換するだけです。

// get the current time from the system clock 
Instant now = SystemClock.Instance.Now; 

// get a time zone 
DateTimeZone tz = DateTimeZoneProviders.Tzdb["Asia/Tokyo"]; 

// use now and tz to get "today" 
LocalDate today = now.InZone(tz).Date; 

これは最小限のコードです。もちろん、あなたは(あなたがDateTime.Nowで行ったように)コンピュータのローカルタイムゾーンを使用する場合、あなたはそのようにそれを得ることができます。

DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault(); 

そして実際にそれを正しく実装するには、IClockインターフェイスから.Nowを呼び出す必要がありますあなたの単体テストのためにシステム時計を擬似時計に置き換えることができるようにします。

これは、野田タイムが意図的にあなたに物事を隠さない方法の素晴らしい例です。あなたがDateTime.Nowに電話をしたときに、これはまだボンネットの下で行われていますが、それは見えません。 You can read more about Noda Time's design philosophy in the user guide

11

ノーダタイム1.x用のマットの答えはスポットです。

ノーダタイム2.0では、基本的にはIClockDateTimeZoneの組み合わせであるZonedClockを導入しています。あなたは同じタイムゾーンで現在の時刻を複数回使いたいと思うので、それを注入することができます(私はあなたが依存性注入を使用していると仮定しています)、それを保持してから使用してください。たとえば:

class SomeClass 
{ 
    private readonly ZonedClock clock; 

    internal SomeClass(ZonedClock clock) 
    { 
     this.clock = clock; 
    } 

    internal void DoSomethingWithDate() 
    { 
     LocalDate today = clock.GetCurrentDate(); 
     ... 
    } 
} 

あなたは、通常、例えば、IClockを取り、新しい拡張メソッドのいずれかを使用してZonedClockを提供しますそれは本当に財産すべきではないと私は(それが変わる方法与えられた)IClockからNowプロパティを削除しています - あなたの1.xのコードは、とにかく2.xで動作しません

var clock = SystemClock.Instance; 
var zoned = clock.InUtc(); 
// Or... 
var zoned = clock.InZone(DateTimeZoneProviders.Tzdb["Europe/London"]; 
// Or... 
var zoned = clock.InTzdbSystemDefaultZone(); 
// Or... 
var zoned = clock.InBclSystemDefaultZone(); 

注 - 今はGetCurrentInstant()の方法です。

+0

私はそれが好きです。 2.0はいつもより良く見えています! –

関連する問題