DateTimeOffset同日比較

ジョシュ

次の要件で興味深い問題が発生しました。プロセスが同じ日に実行されたかどうかをテストし、実行されていない場合はテストします。日付はDataTimeOffsetとして保存されます。

私の最初のアプローチは次のとおりでした。

  1. これらの日付は異なるタイムゾーンで作成され、異なるオフセットを持つ可能性があるため、両方の値をUTCに変換します。
  2. 各値の日付値を表示します。Dateメソッドはオフセットを無視するため、これはUTCに変換した後に実行されます。

これはほとんどのシナリオで機能しましたが、ロジックが失敗するケースが1つありました。値の1つに前日/翌日に近い時刻がある場合、UTCに変換すると、日付が変更されます。他の値に前日/翌日に変換される時刻がない場合、日付の比較は失敗しました。

そのため、そのシナリオを含めるために次のロジックを作成することになりました。

public static bool SameDate(DateTimeOffset first, DateTimeOffset second)
{
    bool returnValue = false;
    DateTime firstAdjusted = first.ToUniversalTime().Date;
    DateTime secondAdjusted = second.ToUniversalTime().Date;

    // If date is now a day ahead after conversion, than add/deduct a day to other date if that date hasn't advanced
    if (first.Date < firstAdjusted.Date && second.Date == secondAdjusted.Date)
        secondAdjusted = secondAdjusted.Date.AddDays(1);
    if (first.Date > firstAdjusted.Date && second.Date == secondAdjusted.Date)
        secondAdjusted = secondAdjusted.Date.AddDays(-1);

    if (second.Date < secondAdjusted.Date && first.Date == firstAdjusted.Date)
        firstAdjusted = firstAdjusted.Date.AddDays(1);
    if (second.Date > secondAdjusted.Date && first.Date == firstAdjusted.Date)
        firstAdjusted = firstAdjusted.Date.AddDays(-1);

    if (DateTime.Compare(firstAdjusted, secondAdjusted) == 0)
        returnValue = true;

    return returnValue;
}

失敗していたユニットテストは次のとおりです。

 [TestMethod()]
 public void SameDateTest()
 {
 DateTimeOffset current = DateTimeOffset.Now;
 DateTimeOffset first = current;
 DateTimeOffset second = current;

 // 23 hours later, next day, with negative offset (EST) -- First rolls over
 first = new DateTimeOffset(2014, 1, 1, 19, 0, 0, new TimeSpan(-5, 0, 0));
 second = new DateTimeOffset(2014, 1, 2, 18, 0, 0, new TimeSpan(-5, 0, 0));
 Assert.IsFalse(Common.SameDate(first, second));

 // 23 hours earlier, next day, with postive offset -- First rollovers
 first = new DateTimeOffset(2014, 1, 1, 4, 0, 0, new TimeSpan(5, 0, 0));
 second = new DateTimeOffset(2014, 1, 2, 5, 0, 0, new TimeSpan(5, 0, 0));
 Assert.IsFalse(Common.SameDate(first, second));

 // 23 hours later, next day, with negative offset (EST) -- Second rolls over
 first = new DateTimeOffset(2014, 1, 2, 18, 0, 0, new TimeSpan(-5, 0, 0));
 second = new DateTimeOffset(2014, 1, 1, 19, 0, 0, new TimeSpan(-5, 0, 0));
 Assert.IsFalse(Common.SameDate(first, second));

 // 23 hours earlier, next day, with postive offset -- Second rolls over
 first = new DateTimeOffset(2014, 1, 2, 5, 0, 0, new TimeSpan(5, 0, 0));
 second = new DateTimeOffset(2014, 1, 1, 4, 0, 0, new TimeSpan(5, 0, 0));
 Assert.IsFalse(Common.SameDate(first, second));
}

私の直感は、他の値に基づいてインクリメント/デクリメントするよりもクリーンなアプローチがあるということです。より良いアプローチはありますか?

主な基準:

  1. 同じオフセットを持つように両方の日付を調整します。
  2. 最初の日付と2番目の日付の両方が24時間以内ではなく、同じ暦日に発生する場合にのみtrueを返します。
martijn

両方の日付の違いに合わせて、日付の1つを調整します。

public static bool SameDate(DateTimeOffset first, DateTimeOffset second)
{
    bool returnValue = false;
    DateTime firstAdjusted = first.ToUniversalTime().Date;
    DateTime secondAdjusted = second.ToUniversalTime().Date;

    // calculate the total diference between the dates   
    int diff = first.Date.CompareTo(firstAdjusted) - second.Date.CompareTo(secondAdjusted);
    // the firstAdjusted date is corected for the difference in BOTH dates.
    firstAdjusted = firstAdjusted.AddDays(diff);

    if (DateTime.Compare(firstAdjusted, secondAdjusted) == 0)
        returnValue = true;

    return returnValue;
}

この関数では、オフセットが24時間を超えることはないと想定しています。IEの日付と調整された日付の差は、2日以上になりません。そうでない場合は、期間比較を使用できます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

DateTimeと解析されたDateTimeOffsetティックの比較の違い

分類Dev

null許容のDateTimeOffset変数を比較する最良の方法は?

分類Dev

ローカルのDateTimeをDateTimeOffsetと比較します

分類Dev

DateTimeとDateTimeOffset

分類Dev

Example of ambiguous DateTimeOffset

分類Dev

DateTimeOffsetの問題

分類Dev

Passing datetimeoffset to web api

分類Dev

DatetimeOffsetとSqlite

分類Dev

DateTimeOffset.UtcNow.ToUnixTimeSecondsとDateTimeOffset.Now.ToUnixTimeSeconds

分類Dev

SQLServerのdatetimeoffsetの使用

分類Dev

ODataのDateTimeOffsetの形式

分類Dev

What is the C# DateTimeOffset equivalent in Go

分類Dev

datetimeoffsetをWebAPIに渡す

分類Dev

What does SSMS show for a DateTimeOffset(7)?

分類Dev

EntityFrameworkの移行:AlterColumnDateTimeからDateTimeOffset

分類Dev

同じ週のTeradataSQL同日前年度

分類Dev

前年の年初来から同日まで

分類Dev

DateTimeOffsetをNullable <DateTimeOffset>に強制変換します

分類Dev

DateTimeOffsetをInt64に変換し、DateTimeOffsetに戻します

分類Dev

SQLServerのdatetimeoffsetでZonedDateTimeを使用する

分類Dev

DateTimeOffsetをPostreSQLに保存する方法

分類Dev

あいまいなDateTimeOffsetの例

分類Dev

2月28日のDateTimeOffsetの処理

分類Dev

LinuxでDateTimeOffset.TryParseが失敗する

分類Dev

NESTDateRange述語でDateTimeOffsetを使用する

分類Dev

ScichartでのDateTimeOffsetのサポート

分類Dev

How to keep the date in DateTimeOffset and reset the offset to zero (UTC)?

分類Dev

SQLServerでのUTCのdatetimeoffsetとdatetime2

分類Dev

DateTimeOffset、明確な理解がない

Related 関連記事

ホットタグ

アーカイブ