如何知道在C#的时间范围内它是该月的第一天的次数

时间:2015-02-26 20:56:05

标签: c# datetime

假设我有两个DateTime个对象d1d2定义的时间范围。

我怎么知道一个月的第一天在时间范围内的次数?

3 个答案:

答案 0 :(得分:3)

你可以这样:

DateTime startDate = DateTime.Now.AddDays(-100); // {18/11/2014 4:04:07 PM}
DateTime endDate = DateTime.Now; // {26/02/2015 4:04:07 PM}
var query = Enumerable.Range(0, 1 + (endDate - startDate).Days)
    .Select(i => startDate.AddDays(i))
    .Where(r=> r.Day == 1);

这将首先创建从开始到结束的日期集合,之后您可以过滤Day部分为1的结果。

输出:

foreach (var dateTime in query)
{
    Console.WriteLine(dateTime);
}

输出:

01/12/2014 4:04:07 PM
01/01/2015 4:04:07 PM
01/02/2015 4:04:07 PM

答案 1 :(得分:2)

没有先前挫伤力的另一种方法......


DateTime startDate = new DateTime(2014, 09, 01);
DateTime endDate = new DateTime(2015, 02, 02);
DateTime loopDate = startDate;
var totalMonths = ((endDate.Year - startDate.Year) * 12) + endDate.Month - startDate.Month;
if (startDate.Day != 1)
{
    loopDate = new DateTime(startDate.Year, startDate.Month, 1).AddMonths(1);
}

List<DateTime> firstDayOfMonth = Enumerable.Range(0, totalMonths)
    .Select(i => loopDate.AddMonths(i))
    .ToList();

firstDayOfMonth.Add(new DateTime(endDate.Year,endDate.Month, 1));

根据提供的解决方案[{3}}计算月份差异。稍后它会检查startDate是否是一个月的第一天然后忽略它,然后创建一个loopDate,这将是下个月的第一天,并持续到endDate

这是一个有效的here

答案 2 :(得分:0)

这是一个简单的数学。

D1:2015年1月23日 D2:2015年3月2日

查找已经过去的月数(d2.Month - d1.Month)。

这将为您提供已过去的第一个月的数量。

您需要考虑的边缘情况:

  1. D1是这个月的第一天 - 只需做一个简单的检查 并在结果中添加1
  2. D1和D2年份不同 - 这也很简单:
    2.1。计算D1到年末之间的月份(IE:D1到 12月31日),然后确保检查边缘情况1.

    2.2。计算D2与其年初之间的月份(IE:1月1日至D2)

    2.3。之后,每年增加12个大于1的差异(它 意味着超过一年 - D1是2010年,D2是2013年 - 2年 整整几年过去了。第一步是2010年的几个月, 和2013年的第2步。

    2.4。添加步骤1,2和3的结果 在一起。