列出两个日期之间的月份

use*_*760 19 c#

我想知道在给定开始和结束日期时,如何检索两个日期之间的月份和年份.

例如:Start Date: '1/1/2011'(mm/dd/yyyy)End date :'11/30/2011'.要检索的月份和年份是January,2011; February,2011; March,2011; and so on till November,2011

Jod*_*ell 46

开始了

    public static IEnumerable<Tuple<string, int>> MonthsBetween(
            DateTime startDate,
            DateTime endDate)
    {
        DateTime iterator;
        DateTime limit;

        if (endDate > startDate)
        {
            iterator = new DateTime(startDate.Year, startDate.Month, 1);
            limit = endDate;
        }
        else
        {
            iterator = new DateTime(endDate.Year, endDate.Month, 1);
            limit = startDate;
        }

        var dateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat;
        while (iterator <= limit)
        {
            yield return Tuple.Create(
                dateTimeFormat.GetMonthName(iterator.Month),
                iterator.Year);                
            iterator = iterator.AddMonths(1);
        }
    }
Run Code Online (Sandbox Code Playgroud)

显然你这样称呼它

var startDate = DateTime.ParseExact("01/01/2011", "MM/dd/yyyy");
var endDate = DateTime.ParseExact("11/30/2011", "MM/dd/yyyy");

var months = MonthsBetween(startDate, endDate);
Run Code Online (Sandbox Code Playgroud)

结果应该是这样的

{
    {  "January", 2011  },
    {  "February", 2011  },
    {  "March", 2011  },
    {  "April", 2011  },
    {  "May", 2011  },
    {  "June", 2011  },
    {  "July", 2011  },
    {  "August", 2011  },
    {  "September", 2011  },
    {  "October", 2011  },
    {  "November", 2011  },
}
Run Code Online (Sandbox Code Playgroud)

月份名称取决于您的文化,我认为,这正是您所要求的,对吧?

  • @Al-HanashMoataz,它确实使代码变得更简单,但是请记住,现在将在底层使用“System.ValueTuple”,值已从属性切换到字段,并且仍然称为“Item1”和“Item2”, “在引擎盖下”。 (2认同)

V4V*_*tta 13

您可以从while循环开始,其中开始日期小于或等于结束日期

在其中从开始日期拉出相关的月份和年份部分并存储它们(可能您有一个具体的类或a),然后使用一个月将开始日期增加1个月 AddMonths(1)

//something on these lines 
while(startdate <= enddate)
{
// pull out month and year
startdate = startdate.AddMonths(1);
}
Run Code Online (Sandbox Code Playgroud)

  • 开始日期必须从第 1 天开始,否则(例如)01/20/2018 和 02/10/2018 之间的日期将仅返回一个月 (2认同)

bhu*_*vin 5

使用这个公式:

((date1.Year - date2.Year) * 12) + date1.Month - date2.Month
Run Code Online (Sandbox Code Playgroud)

你得到月数。

以适当的方式使用它,您将破解它。

欢迎来到 Stackoverflow ,这里是您的职责所在,并为此提供思路供兄弟会在您遇到问题时执行。


小智 5

您可以使用Enumerable.Range函数获取两个日期之间的月份和年份,

var start = new DateTime(2011, 1, 1);
var end = new DateTime(2011, 11, 30);

var diff = Enumerable.Range(0, 13).Select(a => start.AddMonths(a))
           .TakeWhile(a => a <= end)
           .Select(a => String.Concat(a.ToString("MMMM") + ", " + a.Year));
Run Code Online (Sandbox Code Playgroud)

  • 如果 end.Day&lt;start.Day,则不正确。2011-1-23--&gt;2011-2-1 将导致 (2011-1)。应与结束日期所在月份的最后日期进行比较。.TakeWhile(a =&gt; a &lt;= end.AddDays(DateTime.DaysInMonth(end.Year,end.Month)-end.Day)) (2认同)