我有一些获取日期的代码:
DateTime startDate = new DateTime(2010, 1,4);
我想创建一个功能
string message = CalculateUpcomingAnniversary(startDate);
我正在尝试计算今天是否可能是即将到来的周年纪念日
因此,如果在接下来的5天内(给定开始日期)要迎来周年纪念日,我希望有一个函数返回类似“ 3周年纪念日即将在4天内……”的功能。
对于其他任何事情,我只想返回空字符串。最有效的计算方法是什么?
因此,鉴于上述开始日期,如果我今天运行它,它将返回一个空白字符串,但是如果我在2014年1月5日运行了此函数,它将返回一个字符串“ 1天4周年”。
最佳答案
您可能希望将其分为两个功能。首先找到这样的下一个周年纪念日:
public DateTime GetNextAnniversary(DateTime startDate)
{
var now = DateTime.Now
var next = startDate.AddYears(now.Year - startDate.Year);
return now > next ? next.AddYears(1) : next;
}
您可以这样设置日期格式:
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;
}
也许更完整的方法如下所示:
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);
}
当然,这是一个非常原始的字符串格式化功能,可以进行重大改进。