C# 如何知道在C语言中,在一个时间范围内,每个月的第一天是多少次#
假设我有一个由两个C# 如何知道在C语言中,在一个时间范围内,每个月的第一天是多少次#,c#,datetime,C#,Datetime,假设我有一个由两个DateTime对象定义的时间框架,d1和d2 我怎么知道一个月的第一天在时间范围内的次数呢?您可以这样: 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 - star
DateTime
对象定义的时间框架,d1
和d2
我怎么知道一个月的第一天在时间范围内的次数呢?您可以这样:
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
你可以这样做:
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
这是简单的数学
D1:2015年1月23日
D2:2015年3月2日
查找已过去的月数(d2.Month-d1.Month)
这将为您提供经过的第一个月的数量
您需要考虑的边缘情况:
2.1. 计算首被告与年末之间的月数(即:首被告至 12月31日),然后确保检查边缘情况1 2.2。计算D2与年初之间的月份(即:1月1日至D2) 2.3。之后,如果每年的差异大于1,则增加12 表示超过一年-D1为2010年,D2为2013年-2 整整几年过去了,第一步在2010年的几个月里开始了, 2013年的第2步 2.4.添加步骤1、2和3的结果 一起
2.1.计算首被告与年末之间的月数(即:首被告至 12月31日),然后确保检查边缘情况1 2.2.计算D2与年初之间的月份(即:1月1日至D2) 2.3.之后,每年大于1的差额加上12(它 表示超过一年-D1为2010年,D2为2013年-2 整整几年过去了,第一步在2010年的几个月里开始了, 2013年的第2步 2.4.添加步骤1、2和3的结果 一起
另一种没有先前布鲁伊特力的方法
DateTime startDate=新日期时间(2014,09,01);
DateTime endDate=新的日期时间(2015,02,02);
DateTime loopDate=startDate;
var totalMonths=((endDate.Year-startDate.Year)*12)+endDate.Month-startDate.Month;
如果(起始日期!=1)
{
loopDate=新的日期时间(startDate.Year,startDate.Month,1).AddMonths(1);
}
List firstDayOfMonth=Enumerable.Range(0,totalMonths)
.Select(i=>loopDate.AddMonths(i))
.ToList();
添加(新的日期时间(endDate.Year,endDate.Month,1));
这将根据提供的解决方案计算月差。稍后,它将检查startDate
是否为月的第一天,然后忽略它,并创建一个loopDate
,该日期将是下一个可用的月的第一天,并一直持续到endDate
这是一个有效的方法。另一种没有先前布鲁伊特力的方法
DateTime startDate=新日期时间(2014,09,01);
DateTime endDate=新的日期时间(2015,02,02);
DateTime loopDate=startDate;
var totalMonths=((endDate.Year-startDate.Year)*12)+endDate.Month-startDate.Month;
如果(起始日期!=1)
{
loopDate=新的日期时间(startDate.Year,startDate.Month,1).AddMonths(1);
}
List firstDayOfMonth=Enumerable.Range(0,totalMonths)
.Select(i=>loopDate.AddMonths(i))
.ToList();
添加(新的日期时间(endDate.Year,endDate.Month,1));
这将根据提供的解决方案计算月差。稍后,它将检查startDate
是否为月的第一天,然后忽略它,并创建一个loopDate
,该日期将是下一个可用的月的第一天,并一直持续到endDate
这是一个工作示例。添加一个示例代码来解释您的问题更多您的意思是,例如,在2014年12月31日至2015年3月23日之间,第一天是多少天?(1月1日,2月1日,3月1日)?3次,类似这样?可能重复添加示例代码以解释您的问题更多您的意思是,例如,在2014年12月31日至2015年3月23日之间,第一天是多少天?(1月1日,2月1日,3月1日)?3次,类似这样的情况?可能重复我相信有一种方法不需要你列举一组日期。简单的算术应该可以做到。但它仍然是一个有效的答案。这是一种蛮力的方法。如果我需要计算1月1日到1月1日之间的整个月1日,我会担心它的性能st 100至3月5日25000@thorkia,它可以在任何时间内计算从
1-1-1
到9999-12-31
的日期。@thorkia,.Net中DateTime
的最大允许时间是9999
年,这种bruit-force方法只需要不到一秒钟的时间。我确信有一种方法不需要您枚举集合在日期上。简单的算术应该可以解决这个问题。但这仍然是一个有效的答案。这是一个蛮力的解决方法。如果我需要计算100年1月1日到3月5日之间的整个月1日,我会担心它的性能25000@thorkia,创建的,用于立即计算从1-1-1
到9999-12-31
的日期。@thor起亚,在.Net中,只允许DateTime
的最大值为9999
年,而这个bruit-force方法只需要不到一秒钟的时间。你忘了