2015-11-11 13 views
8

コードの一部を静的にDateTime.UtcNowに呼び出すことから、基本的にはDateTimeOffset.UtcNowを返すタイムプロバイダサービスを呼び出すようにアップグレードする必要があります。このDateTimeOffsetインスタンスをDateTimeにさらに変換するには、DateTimeプロパティがあります。また、DateTimeOffsetからDateTimeへの暗黙の変換があるようです。DateTimeOffset.UtcNow.DateTimeはDateTime.UtcNowと同等ですか?

私は、これらの2つが同等でないところで私が今見ることができないいくつかのエッジケースがあるかもしれないことに少し気になります。ある?

+1

"このDateTimeOffsetインスタンスをDateTimeにさらに変換するには、DateTimeプロパティがあります。" - シナリオに適していると思われる「UtcDateTime」プロパティもあります。 – Joe

答えて

4

内部的には、次のようになります。

public static DateTimeOffset UtcNow { 
     get { 
      return new DateTimeOffset(DateTime.UtcNow); 
     } 
    } 

    public DateTime DateTime { 
     get { 
      return ClockDateTime; 
     } 
    } 
    private DateTime ClockDateTime { 
     get { 
      return new DateTime((m_dateTime + Offset).Ticks, DateTimeKind.Unspecified); 
     } 
    } 

    public DateTime UtcDateTime { 
     [Pure] 
     get { 
      Contract.Ensures(Contract.Result<DateTime>().Kind == DateTimeKind.Utc); 
      return DateTime.SpecifyKind(m_dateTime, DateTimeKind.Utc); 
     } 
    } 

あなたはUTCに基づいていたが、その後Unspecifiedに変換される日時を取得して終わる可能性のようなので、それが見えます。

+0

結果に「DateTime.SpecifyKind」を呼び出す必要があります'DateTime.UtcNow'とまったく同じにするには十分でしょうか? – hvd

+0

正しいと思われますが、作成する3番目のDateTimeオブジェクトにはなりませんか? UTCNow、ClockDateTime、最後に種類が調整されます。 OPがOKである可能性があるはいを変換して喜んでいる場合。 100%同等であることに頼っている既存のコードの場合、問題が発生する可能性があります。 – MattC

+0

'DateTimeOffset'インスタンスで' .DateTime'プロパティの代わりに '.UtcDateTime'を使用できますか?同様に: 'DateTimeOffset.UtcNow.UtcDateTime' –

2

the .NET reference sourceから:だから

public static DateTimeOffset UtcNow { 
    get { 
     return new DateTimeOffset(DateTime.UtcNow); 
    } 
} 

それはDateTime.UtcNowと同等だように、はい、それが見えます。

+0

それは少し後でmangledを得るように思われるので、私はあなたが正しいと思う彼らは同じ値を持つかもしれないが、 'DateTimeKind'設定については不明です。 – MattC

3

DateTimeOffset.UtcNow.DateTime.Kindの値を見ると、それが未指定であることがわかります。指定されていない種類は、フレームワークによってローカルタイムとして扱われます。 DateTime.UtcNowの種類はUtcなので、タイムゾーン変換がローカルタイムゾーンに適用される場合と、ローカルタイムゾーンからタイムゾーン変換が適用される場合の違いがあります。

回避策は、Utc種類が指定されたDateTimeOffset.UtcNow.UtcDateTimeを使用することです。