最简单的方法是在.net中找到两个时间戳之间的完整日历年、月、日和小时

最简单的方法是在.net中找到两个时间戳之间的完整日历年、月、日和小时,.net,algorithm,datetime,.net,Algorithm,Datetime,我想做的事情如下 给定两个日期,例如1998年3月2日和2011年9月25日。如何将间隔分割为 一九九八年三月二日至一九九八年三月三十一日(30天) 1998年4月1日至1998年12月31日(9个月) 1999年1月1日至2010年12月31日(11年) 2011年1月1日至2011年8月31日(8个月) 2011年9月1日至2011年9月25日(30天) 但是,如果任何时间间隔不存在,我们不想强制将其包括在内,即结果不总是天/月/年/月/天,例如 给定开始日期='1998-02-01'和结束

我想做的事情如下

给定两个日期,例如1998年3月2日和2011年9月25日。如何将间隔分割为

  • 一九九八年三月二日至一九九八年三月三十一日(30天)
  • 1998年4月1日至1998年12月31日(9个月)
  • 1999年1月1日至2010年12月31日(11年)
  • 2011年1月1日至2011年8月31日(8个月)
  • 2011年9月1日至2011年9月25日(30天)

    但是,如果任何时间间隔不存在,我们不想强制将其包括在内,即结果不总是天/月/年/月/天,例如

    给定开始日期='1998-02-01'和结束日期='2011-03-31', 预期结果为(月/年/月)

    1998-02-01=>1998-12-31 1999-01-01 ==> 2010-12-31 2011-01-01=>2011-03-31

    给定开始日期='1998-02-01'和结束日期='1998-03-31', 预期结果为(2个月)

    1998-02-01=>2011-03-31

    给定开始日期='1998-01-05'和结束日期='1998-02-03', 预期结果为(天/天)
    1998-01-05 ==> 2011-01-31 1998-02-01=>2011-02-03

  • 如果我的描述没有意义,请看以下内容。我试图在.net中实现同样的功能


    您可以这样做:

    DateTime startDate = new DateTime(1998, 3, 2);
    DateTime endDate = new DateTime(2011, 9, 25);
    
    DateTime firstMonth = new DateTime(startDate.Year, startDate.Month, 1).AddMonths(1);
    DateTime firstYear = new DateTime(startDate.Year + 1, 1, 1);
    DateTime lastYear = new DateTime(endDate.Year, 1, 1);
    DateTime lastMonth = new DateTime(endDate.Year, endDate.Month, 1);
    
    Console.WriteLine("{0:yyyy-MM-dd} - {1:yyyy-MM-dd}", startDate, firstMonth.AddDays(-1));
    Console.WriteLine("{0:yyyy-MM-dd} - {1:yyyy-MM-dd}", firstMonth, firstYear.AddDays(-1));
    Console.WriteLine("{0:yyyy-MM-dd} - {1:yyyy-MM-dd}", firstYear, lastYear.AddDays(-1));
    Console.WriteLine("{0:yyyy-MM-dd} - {1:yyyy-MM-dd}", lastYear, lastMonth.AddDays(-1));
    Console.WriteLine("{0:yyyy-MM-dd} - {1:yyyy-MM-dd}", lastMonth, endDate);
    
    输出:

    1998-03-02 - 1998-03-31
    1998-04-01 - 1998-12-31
    1999-01-01 - 2010-12-31
    2011-01-01 - 2011-08-31
    2011-09-01 - 2011-09-25
    

    我不确定这里问的是什么?为了重申和澄清,您希望将任意开始日期和结束日期分解为给定范围内的多个范围,但所有3个值(开始日期、结束日期和时间范围)都是已知的?下一个问题是你尝试了什么?算法的输入是两个时间戳;i) startTime ii)endTime,输出是完整日历日/月/年的范围。好的,我想我现在看到了,我喝了咖啡,你希望以天为单位从开始日期到该月底,然后以月为单位拆分到年底,然后以年为单位拆分到年底,然后返回到结束日期,与此过程相反?根据您的最新情况,如果您跳过了几年(例如2010-07-01到2011-04-30),您是希望间隔10个月还是6个月1次,4个月1秒?@psubsee:yes,您是对的。至于你的第二个问题,到目前为止你从哪里得到的。至于你的问题,当我试图找到答案的时候,我不知道答案中是否还有其他问题。i、 检查结束日期是否不是最大可能的日期,否则加上一个月,然后从中减去一天,就像Guffa那样。然后与给定的结束日期进行比较。我一直在寻找一个优雅的解决方案,因为问题显然没有那么复杂:(我想我需要更改问题陈述。结果并不总是天/月/年/月/days@WPFAbsoluteNewBie:然后您只需将间隔的开始和结束以及开始和结束日期进行比较。如果您得到的间隔的开始时间在结束时间之后,或者开始时间在开始日期之前,或者结束时间之前在结束日期之后,它不应包含在结果中。如果剩下一个空集合,只需将开始日期和结束日期设置为一个间隔。给定开始日期='1998-02-01'和结束日期='1998-09-25',建议的解决方案将给出我(假设非闰年)1998-02-01-1998-02-01-28应该是1998-02-01-1998-03-01-1998-08-31-1998-09-01-1998-09-25-1998-02-01-1998-08-31-09-01-1998-09-25-25-WPFAbsoluteNewBie:如果你想了解开始日期和结束日期为月/年的特殊情况,那么你必须特别检查。