9

顧客が今後 7 日以内に誕生日を迎えるときにアラートを受信しようとしています。

私はこのコードでそれを試しました:

public bool IsBirthdayImminent
{
    get { return DateOfBirth != null && DateOfBirth.Value.Date >= DateTime.Today.Date.AddDays(-7); }
}

もちろん、日付はその年 (たとえば 05/21/1980) と共に保存され、年も比較されるため、これは機能しません。したがって、このクエリは絶対にありtrueません。ただし、次の 7 日以内に生まれた場合はそうではありません。

年を無視するようにこのクエリを変更するにはどうすればよいですか?

編集:

さて、クエリ自体はまったく問題ありません。私の主なポイントは、閏年と 12 月 <-> 1 月前後の状況の処理です。

4

5 に答える 5

11

次のコードを使用することをお勧めします。これには、12 月から 1 月と 2 月 29 日の前後のケースが含まれます。ただし、2 月 28 日を調べて、指定された に含めるか除外するかを修正することをお勧めしますdays

    BirthdayImminent(new DateTime(1980, 1, 1), new DateTime(2012, 1, 2), 7); // false
    BirthdayImminent(new DateTime(1980, 1, 1), new DateTime(2012, 12, 28), 7); // true
    BirthdayImminent(new DateTime(1980, 2, 28), new DateTime(2012, 2, 21), 7); // true

    private static bool BirthdayImminent(DateTime birthDate, DateTime referenceDate, int days)
    {
        DateTime birthdayThisYear = birthDate.AddYears(referenceDate.Year - birthDate.Year);

        if (birthdayThisYear < referenceDate)
            birthdayThisYear = birthdayThisYear.AddYears(1);

        bool birthdayImminent = (birthdayThisYear - referenceDate).TotalDays <= days;

        return birthdayImminent;
    }

また、下のコメントに投稿されたGuvanteのエッジ ケースにも注意してください。

于 2013-06-05T19:27:42.660 に答える
1

「DayOfYear」を使用できます。

public bool IsBirthdayImminent
{
    get { return DateOfBirth != null && Math.Abs(DateOfBirth.Value.Date.DayOfYear - DateTime.Today.DayOfYear) <= 7; }
}
于 2013-06-05T19:17:10.200 に答える
1

このようなもの:

DateTime birthDate = new DateTime(2012, 12, 2);

DateTime birthdayThisYear;
if (birthDate.Month == 2 && birthDate.Day == 29 && DateTime.IsLeapYear(DateTime.Now.Year))
    birthdayThisYear = new DateTime(DateTime.Now.Year, 2, 28);
else
    birthdayThisYear = new DateTime(DateTime.Now.Year, birthDate.Month, birthDate.Day);

bool birthdayImminent = birthdayThisYear > DateTime.Now && (birthdayThisYear - DateTime.Now).TotalDays <= 7;

ゲッターとして:

public bool IsBirthdayImminent
{
    get 
    { 
        if (DateOfBirth == null) 
            return false;
        else
        {
            DateTime birthdayThisYear;
            if (birthDate.Month == 2 && birthDate.Day == 29 && DateTime.IsLeapYear(DateTime.Now.Year))
                birthdayThisYear = new DateTime(DateTime.Now.Year, 2, 28);
            else
                birthdayThisYear = new DateTime(DateTime.Now.Year, birthDate.Month, birthDate.Day);

            return birthdayThisYear > DateTime.Now && (birthdayThisYear - DateTime.Now).TotalDays <= 7;
        }
    }
}
于 2013-06-05T19:15:20.243 に答える
0

birtdate の年を明示的に に設定すると、DateTime.Today.Yearうまく比較できます。

于 2013-06-05T19:13:55.697 に答える
-1

これを試して:

public bool IsBirthdayImminent
{
    get { return DateOfBirth != null && DateOfBirth.Value.Date.AddYear(DateTime.Now.Year -DateOfBirth.Value.Year) >= DateTime.Today.Date.AddDays(-7); }
}
于 2013-06-05T19:16:17.200 に答える