Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道在C语言中,在一个时间范围内,每个月的第一天是多少次#_C#_Datetime - Fatal编程技术网

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)

这将为您提供经过的第一个月的数量

您需要考虑的边缘情况:

  • D1是一个月的第一天-只需做一个简单的检查 并在结果中添加1
  • D1和D2年份不同-这也很简单:
    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的结果 一起

  • 这是简单的数学

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

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

    这将为您提供经过的第一个月的数量

    您需要考虑的边缘情况:

  • D1是一个月的第一天-只需做一个简单的检查 并在结果中添加1
  • D1和D2年份不同-这也很简单:
    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方法只需要不到一秒钟的时间。你忘了