当客户在接下来的7天内过生日时,我正试图收到提醒。
我已尝试使用此代码:
public bool IsBirthdayImminent
{
get { return DateOfBirth != null && DateOfBirth.Value.Date >= DateTime.Today.Date.AddDays(-7); }
}
当然这不起作用,因为日期与其年份一起存储(比如说是05/21/1980),它也比较了这一年。所以这个查询永远不会是true
- 好吧,如果你在接下来的七天内出生,那就不行了。
如何修改此查询以忽略年份?
修改
好吧,查询本身根本不是问题。我的主要观点是处理闰年和12月左右的情况< - >一月。
答案 0 :(得分:9)
我建议使用以下代码。这包括12月至1月和2月29日左右的案件。虽然您可能希望在给定的days
内查看并排除2月28日的更正。
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边缘案例。
答案 1 :(得分: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;
}
}
}
答案 2 :(得分:0)
将birtdate的年份明确设置为DateTime.Today.Year
,它会比较好。
答案 3 :(得分:0)
您可以使用“DayOfYear”:
public bool IsBirthdayImminent
{
get { return DateOfBirth != null && Math.Abs(DateOfBirth.Value.Date.DayOfYear - DateTime.Today.DayOfYear) <= 7; }
}
答案 4 :(得分:-1)
试试这个:
public bool IsBirthdayImminent
{
get { return DateOfBirth != null && DateOfBirth.Value.Date.AddYear(DateTime.Now.Year -DateOfBirth.Value.Year) >= DateTime.Today.Date.AddDays(-7); }
}