9

我试图在客户在接下来的 7 天内过生日时收到提醒。

我已经用这段代码试过了:

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

当然这是行不通的,因为日期与年份一起存储(比如 1980 年 5 月 21 日),并且它还比较年份。所以这个查询永远不会true——好吧,如果你是在接下来的 7 天内出生的话。

如何修改此查询以忽略年份?

编辑:

好吧,查询本身根本不是问题。我的主要观点是处理闰年和十二月<->一月左右的情况。

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

像这样的东西:

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 回答
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 回答
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 回答