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

C# 如果今天是即将到来的周年纪念日(基于某个开始日期),最好的计算方法是什么?,c#,datetime,C#,Datetime,我有一些获取日期的代码: DateTime startDate = new DateTime(2010, 1,4); 我想创建一个函数 string message = CalculateUpcomingAnniversary(startDate); 我在计算今天是否是即将到来的周年纪念日 因此,如果给定这个开始日期,在接下来的5天内有周年纪念日,我想有一个函数,它可以在4天内返回类似于3周年纪念日的内容 对于其他任何内容,我只想返回空字符串。最有效的计算方法是什么 因此,考虑到上述开始

我有一些获取日期的代码:

 DateTime startDate = new DateTime(2010, 1,4);
我想创建一个函数

 string message = CalculateUpcomingAnniversary(startDate);
我在计算今天是否是即将到来的周年纪念日

因此,如果给定这个开始日期,在接下来的5天内有周年纪念日,我想有一个函数,它可以在4天内返回类似于3周年纪念日的内容

对于其他任何内容,我只想返回空字符串。最有效的计算方法是什么


因此,考虑到上述开始日期,如果我今天运行它,它将返回一个空白字符串,但如果我在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);
}
您可以将日期设置为如下格式:

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);
}
或者,一个更完整的方法可能如下所示:

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);
}

当然,这是一个非常粗糙的字符串格式函数,可以显著改进。

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

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);
}
您可以将日期设置为如下格式:

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);
}
或者,一个更完整的方法可能如下所示:

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);
}

当然,这是一个非常粗糙的字符串格式函数,可以显著改进。

我建议使用类似以下的方法检查我建议使用类似以下的方法检查它听起来像是一个有趣的问题,所以我解决了它。我还处理了闰年与日计数的混乱,这项测试证明了这一点。给你:

编辑:固定和简化

public class AnniversaryConcept : IConceptable
{
    public const int DAYS_TO_LOOK_FORWARD = 5;

    public void Run()
    {
        Console.WriteLine(AnniversaryMessage(GetPastDate(6, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(5, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(4, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(3, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(1, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(0, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(-1, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(-2, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(-3, -1)));

        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -2)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -3)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -4)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -5)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -6)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -7)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -8)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -9)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -10)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -11)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -12)));
    }

    private DateTime GetPastDate(int daysOffset, int yearsOffset)
    {
        return new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).AddYears(yearsOffset).AddDays(daysOffset);
    }

public string AnniversaryMessage(DateTime originalDate)
{
    if (originalDate > DateTime.Now)
    {
        return null;
    }

    int dayDifference = (new DateTime(DateTime.Now.Year, originalDate.Month, originalDate.Day).Date
                                    - DateTime.Now.Date).Days;

    // Already past this date.
    if (dayDifference < 0 || dayDifference > DAYS_TO_LOOK_FORWARD)
    {
        return null;
    }

    return string.Format("{0} year anniversary in {1} days.", 
        DateTime.Now.Year - originalDate.Year, 
        dayDifference);
}
}

这听起来是个有趣的问题,所以我解决了。我还处理了闰年与日计数的混乱,这项测试证明了这一点。给你:

编辑:固定和简化

public class AnniversaryConcept : IConceptable
{
    public const int DAYS_TO_LOOK_FORWARD = 5;

    public void Run()
    {
        Console.WriteLine(AnniversaryMessage(GetPastDate(6, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(5, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(4, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(3, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(1, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(0, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(-1, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(-2, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(-3, -1)));

        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -1)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -2)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -3)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -4)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -5)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -6)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -7)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -8)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -9)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -10)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -11)));
        Console.WriteLine(AnniversaryMessage(GetPastDate(2, -12)));
    }

    private DateTime GetPastDate(int daysOffset, int yearsOffset)
    {
        return new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).AddYears(yearsOffset).AddDays(daysOffset);
    }

public string AnniversaryMessage(DateTime originalDate)
{
    if (originalDate > DateTime.Now)
    {
        return null;
    }

    int dayDifference = (new DateTime(DateTime.Now.Year, originalDate.Month, originalDate.Day).Date
                                    - DateTime.Now.Date).Days;

    // Already past this date.
    if (dayDifference < 0 || dayDifference > DAYS_TO_LOOK_FORWARD)
    {
        return null;
    }

    return string.Format("{0} year anniversary in {1} days.", 
        DateTime.Now.Year - originalDate.Year, 
        dayDifference);
}
}

startDate变量在这里代表什么?@bland是迄今为止您尝试过的最短版本?我见过。@Sachin-我更新了问题,使之更清楚了一点。startDate变量在这里代表什么?@bland是迄今为止您尝试过的最短版本?我见过。@Sachin-我更新了问题,使之更清楚了一点。我更新了问题,因为我可能不清楚。我不想找结婚纪念日。我想计算一下,如果给定开始日期,今天是否是即将到来的周年纪念日。这有意义吗?@leora这主要是伪代码,让您大致了解如何自己实现它。您希望将其实现为一个函数,因此它可能是一个参数。我明白了。我的一个问题是,如果起始日期恰好是闰年,起始日期是2012年2月29日,该怎么办。我想你的GetNextAnyVersary函数会崩溃,因为它会试图为2013年2月29日创建一个日期,而你现在没有。年,你真的是指现在。年??我更新了这个问题,因为我可能不清楚。我不想找结婚纪念日。我想计算一下,如果给定开始日期,今天是否是即将到来的周年纪念日。这有意义吗?@leora这主要是伪代码,让您大致了解如何自己实现它。您希望将其实现为一个函数,因此它可能是一个参数。我明白了。我的一个问题是,如果起始日期恰好是闰年,起始日期是2012年2月29日,该怎么办。我认为你的GetNextAnyVersary函数会崩溃,因为它会试图为2013年2月29日创建一个日期,而这一日期在你现在不存在。年,你真的是指现在。年?这似乎不起作用。例如,如果您的起始日期为2013年5月8日。它在一天内返回14年,而不是今天的13年@莱奥拉:我讨厌留下不好的答案。这应该是固定的。您可以在我的Run方法中看到我测试它的日期,这证明了它的有效性。这会记录一个日期,让你知道DateTime.Now是否有周年纪念日。如果不希望它使用DateTime.Now,请添加另一个DateTime参数并将其发送,然后使用该参数而不是DateTime.Now。这似乎不起作用。例如,如果您的起始日期为2013年5月8日。它在一天内返回14年,而不是今天的13年@莱奥拉:我讨厌留下不好的答案。这应该是固定的。您可以在我的Run方法中看到我测试它的日期,这证明了它的有效性。这会记录一个日期,让你知道DateTime.Now是否有周年纪念日。如果不希望它使用DateTime.Now,请添加另一个DateTime参数并将其发送进来,然后使用该参数而不是DateTime.Now。