获取该月的下一个第n天的日期时间

时间:2017-06-17 14:07:04

标签: c# datetime

如果给定日期和变量n,我如何计算月份日期为第n个日期的日期时间?

例如,今天是6月17日。 我想要一个函数,当提供15将返回7月15日的DateTime。

还有一些例子:

  • 今天是2月26日:功能将在3月30日30日时返回。
  • 今天是12月28日。当提供4时,功能将返回1月4日。
  • 今天是2月28日。功能将在3月29日返回时提供29,除非是闰年,在这种情况下它将在2月29日返回。

4 个答案:

答案 0 :(得分:2)

经过多次编辑,更正和重写后,这是我的最终答案:

下面的方法会返回一个DateTime,表示下次数字day出现在日历中的时间。它使用迭代方法,并以DateTime对象的扩展方法的形式编写,因此不受今天约会的约束,但可以在任何日期使用。

代码执行以下步骤以获得所需的结果:

  1. 确保提供的日期编号有效(大于零且小于32)。
  2. 进入一个永远持续前进的while循环(直到我们休息)。
  3. 检查cDate的月份是否有效(该日期一定不能过去,且该月份必须有足够的日期)。
    • 如果是,请返回。
    • 如果没有,请将月份增加1,将日期设置为1,将includeToday设置为true,以便包含新月的第一天,然后再次执行循环。
  4. 代码:

    static DateTime GetNextDate3(this DateTime cDate, int day, bool includeToday = false)
    {
        // Make sure provided day is valid
        if (day > 0 && day <= 31)
        {
            while (true)
            {
                // See if day has passed in current month or is not contained in it at all
                if ((includeToday && day > cDate.Day || (includeToday && day >= cDate.Day)) && day <= DateTime.DaysInMonth(cDate.Year, cDate.Month))
                {
                    // If so, break and return
                    break;
                }
    
                // Advance month by one and set day to one
                // FIXED BUG HERE (note the order of the two calls)
                cDate = cDate.AddDays(1 - cDate.Day).AddMonths(1);
    
                // Set includeToday to true so that the first of every month is taken into account
                includeToday = true;
            }
            // Return if the cDate's month contains day and it hasn't passed
            return new DateTime(cDate.Year, cDate.Month, day);
        }
    
        // Day provided wasn't a valid one
        throw new ArgumentOutOfRangeException("day", "Day isn't valid");
    }
    

答案 1 :(得分:2)

为什么不这样做?

private DateTime GetNextDate(DateTime dt, int DesiredDay)
{
    if (DesiredDay >= 1 && DesiredDay <= 31)
    {
        do
        {
            dt = dt.AddDays(1);
        } while (dt.Day != DesiredDay);
        return dt.Date;
    }
    else
    {
        throw new ArgumentOutOfRangeException();
    }     
}

答案 2 :(得分:0)

有趣的小谜题。我生成了100个DateTimes,代表每个月的开始日期,然后每个月检查一次,看它是否有我们想要的日期。它很懒,所以当我们找到一个好的时候我们会停下来。

public DateTime FindNextDate(int dayOfMonth, DateTime today)
{
  DateTime yesterday = today.AddDays(-1);
  DateTime currentMonthStart = new DateTime(today.Year, today.Month, 1);
  var query = Enumerable.Range(0, 100)
    .Select(i => currentMonthStart.AddMonths(i))
    .Select(monthStart => MakeDateOrDefault(
      monthStart.Year, monthStart.Month, dayOfMonth,
      yesterday)
    .Where(date => today <= date)
    .Take(1);

  List<DateTime> results = query.ToList();
  if (!results.Any())
  {
    throw new ArgumentOutOfRangeException(nameof(dayOfMonth))
  }
  return results.Single();
}

public DateTime MakeDateOrDefault(
  int year, int month, int dayOfMonth,
  DateTime defaultDate)
{
  try
  {
    return new DateTime(year, month, dayOfMonth);
  }
  catch
  {
    return defaultDate;
  }
}

答案 3 :(得分:0)

当今天是dayOfMonth时,规范有点不清楚。我以为它是返回相同的。否则只会改为&lt; = today.Day

public DateTime FindNextDate(int dayOfMonth, DateTime today)
{
    var nextMonth = new DateTime(today.Year, today.Month, 1).AddMonths(1);
    if(dayOfMonth < today.Day){ 
      nextMonth = nextMonth.AddMonths(1);
    }
    while(nextMonth.AddDays(-1).Day < dayOfMonth){
       nextMonth = nextMonth.AddMonths(1);
    }
    var month = nextMonth.AddMonths(-1);
    return new DateTime(month.Year, month.Month, dayOfMonth);

}