2016-05-16 12 views
0

私はクライアントからの日時を受け取るオブジェクトの時間を無視して、私は2つの日付を比較する必要がDateTimeOffset DateTimeOffsetFromDb比較日付は

をANDタイムゾーン。つまり、私は両方のオブジェクトからの生の日付がほしいです。私はFooDateTimeOffset.DateTime.Dateを使用してみましたが、それは時間の要因はまだのようですので、私が今持っていることはこれです:

DateTimeOffset clientDateTimeOffSet = DateTime.SpecifyKind(CurrentTimeOnClient, DateTimeKind.Utc); 
clientDateTimeOffSet = await RemoveTimeComponentFromDateTimeOffset(clientDateTimeOffSet); 
clientDateTimeOffSet = await SetTimeZoneOffsetToZero(clientDateTimeOffSet); 

とヘルパー・メソッド:

public async Task<DateTimeOffset> SetTimeZoneOffsetToZero(DateTimeOffset dateTimeOffSetObj) 
{ 
    TimeSpan zeroOffsetTimeSpan = new TimeSpan(0, 0, 0, 0, 0); 
    return dateTimeOffSetObj.ToOffset(zeroOffsetTimeSpan); 
} 

public async Task<DateTimeOffset> RemoveTimeComponentFromDateTimeOffset(DateTimeOffset dateTimeOffSetObj) 
{ 
    DateTime dateWithZeroedTime = new DateTime(dateTimeOffSetObj.Year, dateTimeOffSetObj.Month, dateTimeOffSetObj.Day, 0, 0, 0); 
    return dateWithZeroedTime; 
} 

それから私はのDateTimeOffsetをきれいOBJデシベルから(明らかにそれらを変換する必要はないが)同じ方法でそれらを比較して比較する。

bool foo = dateFromDb > dateFromClient; 

P.S.私はこれらの質問が別々に答えられていることを認識していますが、私は目立つ過ちを犯したのか、それとも誇張しているのかを見たいと思います。 (ただし、提案された.Dateの解決策は機能していないようです)。

編集:@James

//TESTING 
    var testDateAndTime = new DateTimeOffset(2008, 5, 1, 8, 6, 32,new TimeSpan(1, 0, 0)); 
    //This is just some db object that has a date field that I had on hand 
    var anncmnt = db.Announcements.First(a => a.Id == 13); 

    //CLEAN TIME AND DATE 
    testDateAndTime = testDateAndTime.DateTime.Date; 

    anncmnt.EndDate = testDateAndTime; 
    await db.SaveChangesAsync(); 
    //TESTING 

Dbの結果:2008-05-01 00:00:00.0000000 -04:00

+1

これらのメソッドはなぜ非同期ですか? 'await'ステートメントがなくても、同期して実行するだけです。 – juharr

+0

APIは非同期であるため、非同期エンドポイントでそれらを使用する必要がある場合に備えて、ヘルパーを非同期にします。私が知っている限り、これらは同期して実行されます(デフォルトでは待ち時間は使用されません)。 – VSO

+1

しかし、そうでない場合には、何かを「非同期」にすることに意味はありません。それはあなたのAPIを使っている人にそれがあるという印象を与えます。 – juharr

答えて

1

忘れましたUTC。 SpecifyKindメソッドを使用してみてください。それはあなたが必要とするものを与えるように見え、以下の私の素早いユニットテストにパスします:

 //TESTING 
     for (var hr = 0; hr < 24; hr++) 
     { 
      var testDateAndTime = new DateTimeOffset(2008, 5, 1, hr, 6, 32, new TimeSpan(1, 0, 0)); 
      var noOffsetDate = DateTime.SpecifyKind(testDateAndTime.Date, DateTimeKind.Utc); 
      Console.WriteLine(noOffsetDate); 
     } 
+0

基本的に、あなたの答えは時間をクリアしますが、タイムゾーンのオフセットはクリアしません。だから、私はそれをdbから取得すると、タイムゾーンオフセットの時間を調整します。これにより、日付を捨てることができます。 – VSO

+0

Jamesさん、うまくいくようです、ありがとうございます。私はこれが日付や時間を変更すると思った(ちょうどオフセットを設定するのではなく、私が意味することを知っているなら、それはUTCに変換するだろう)。私は間違っているように見えます。私はより徹底的にテストし、答えを受け入れるために戻ってきます。 – VSO

+0

私はこれを「買い手に気づく」という答えだと考えています。 Dateフィールドは、元のtime/offsetコンテキストで調べた場合にのみ正確であるため、この変換で情報が失われています。この場合、DBからの時間/オフセット情報が無効であるか無関係であり、安全に切り捨てられる可能性があることを事前に知っておく必要があると仮定しています。真夜中に近いDateTimes(オフセット範囲内)を持つDBのテストケースは、その真実を根絶するのに役立ちます。 –

1

.Date()が動作しないこと奇妙です。このような問題に取り組んだとき、これまで私がやったことです。日時の文字列を解析して比較します。だから私は以下のコードを行う。

dateFromDb = DateTime.Parse(dateFromDb.ToShortDateString()); 
dateFromClient= DateTime.Parse(dateFromClient.ToShortDateString()); 

次に、それを比較して、それが機能するかどうかを確認してください。

+0

最後の手段として実行可能な選択肢のようです。 – VSO