如果今天是即将到来的周年纪念日(基于某个开始日期),最佳计算方法是什么?

leo*_*ora 1 c# datetime

我有一些代码可以获取日期:

 DateTime startDate = new DateTime(2010, 1,4);
Run Code Online (Sandbox Code Playgroud)

我想创建一个函数

 string message = CalculateUpcomingAnniversary(startDate);
Run Code Online (Sandbox Code Playgroud)

而我正试图计算今天是否可能是即将到来的周年纪念日

因此,如果在接下来的5天内出现周年纪念日(考虑到这个开始日期),我希望有一个功能可以返回"4天内即将到来的4天......".

对于其他任何我只想返回空字符串.计算这个的最有效方法是什么?

所以考虑到上面这个开始日期,如果我今天运行它会返回一个空白字符串,但如果我在2014年1月5日运行此功能,它将返回一个字符串" 1天4周年 "

p.s*_*w.g 5

您可能希望将其拆分为两个函数.首先找到这样的下一个周年纪念日:

public DateTime GetNextAnniversary(DateTime startDate)
{
    var now = DateTime.Now
    var next = startDate.AddYears(now.Year - startDate.Year);
    return now > next ? next.AddYears(1) : next;
}
Run Code Online (Sandbox Code Playgroud)

您可以这样格式化日期:

public string GetAnniversaryString(DateTime startDate)
{
    var next = GetNextAnniversary(startDate);
    int nYears = next.Year - startDate.Year;
    var span = next - DateTime.Now;
    return span.Days <= 5 
        ? string.Format("{0} year anniversary in {1} days", nYears, span.Days)
        : string.Empty;
}
Run Code Online (Sandbox Code Playgroud)

或许更完整的方法看起来像这样:

var now = DateTime.Now;
var next = GetNextAnniversary(startDate);
int nYears = next.Year - startDate.Year;
var span = next - DateTime.Now;
if (span.Days <= 30)
{
    return string.Format("{0} year anniversary in {1} days", nYears, span.Days);
}
else
{
    int months = next.Month - startDate.Month;
    if (next.Year > now.Year)
    {
        months += CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(now.Year);
    }

    return string.Format("{0} year anniversary in {1} months", nYears, months);
}
Run Code Online (Sandbox Code Playgroud)

当然,这是一个非常粗略的字符串格式化功能,并且可以显着改进.