假设我有两个DateTime
个对象d1
和d2
定义的时间范围。
我怎么知道一个月的第一天在时间范围内的次数?
答案 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)。
这将为您提供已过去的第一个月的数量。
您需要考虑的边缘情况:
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的结果 在一起。