【问题标题】:List the months between two dates列出两个日期之间的月份
【发布时间】:2012-08-13 08:24:28
【问题描述】:

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

例如: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

【问题讨论】:

标签: c#


【解决方案1】:

我们来了

public static IEnumerable<(string Month, int Year)> 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 (
            dateTimeFormat.GetMonthName(iterator.Month), 
            iterator.Year
        );

       iterator = iterator.AddMonths(1);
    }
}

显然你这样称呼它

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);

结果应该是这样的

{
    {  "January", 2011  },
    {  "February", 2011  },
    {  "March", 2011  },
    {  "April", 2011  },
    {  "May", 2011  },
    {  "June", 2011  },
    {  "July", 2011  },
    {  "August", 2011  },
    {  "September", 2011  },
    {  "October", 2011  },
    {  "November", 2011  },
}

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

【讨论】:

  • 太完美了!非常感谢!
  • 我们可以使用 Tuple Values 'C# 7.0' 方法签名 IEnumerable MonthsBetween(DateTime startDate,DateTime endDate) 来改进这个答案并作为收益返回( dateTimeFormat.GetMonthName (iterator.Month),iterator.Year);
  • @Al-HanashMoataz,它确实使代码更简单了,但请记住,现在这将在后台使用System.ValueTuple,值已从属性切换到字段并且仍然称为@987654325 @ 和 Item2,“在引擎盖下”。
【解决方案2】:

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

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

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

【讨论】:

  • 这确实应该是选择的答案。字面意思是 2 行代码与更多选择的答案。
  • 这不是选择的答案吗?简单干净。
  • @DanielMarin,而这个答案演示了如何编写循环。它不会返回、产生、列出或构建任何东西,它只是一个循环,在功能上是一个无操作。 OP 要求提供月份名称和年份的序列或列表。
  • startdate 必须从第 1 天开始,否则 01/20/2018 和 02/10/2018 之间的日期(例如)只会返回一个月
【解决方案3】:

您可以使用 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));

【讨论】:

  • 谢谢,兄弟。我使用这种风格 { .Select(e => e.ToString("yyyyMM"));}
  • 如果 end.Day2011-2-1 将导致 (2011-1)。应与结束日期月份的 lastdate 进行比较。 .TakeWhile(a => a
【解决方案4】:

使用这个公式:

((date1.Year - date2.Year) * 12) + date1.Month - date2.Month

你得到月数。

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

欢迎来到 Stackoverflow ,在这里努力工作是你的一部分,并且在你遇到问题时给出思考线是为了博爱。

【讨论】:

  • 需要检查月份,以便从较高月份中减去较低月份,不能假设第一个月总是大于第二个月。
  • @Monkieboy - 你是对的,但是,伙计,这是一粒种子,开发人员在遇到问题时会学习,所以让他弄清楚。
【解决方案5】:

您可以通过使用 Enumerable.Range(startIndex, endIndex) 来使用 Linq。
示例如下:

    private string[] GetMonthsBetweenDates(DateTime deltaDate, int TotalMonths)
{
    var monthsBetweenDates = Enumerable.Range(0, TotalMonths)
                                       .Select(i => deltaDate.AddMonths(i))
                                       .OrderBy(e => e)
                                       .AsEnumerable();

    return monthsBetweenDates.Select(e => e.ToString("MMM")).ToArray();
}

假设当前月份是 11 月,上面的代码应该会产生以下结果。

Nov
Dec
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多