如何按以下顺序显示月份名称

本文关键字:显示 顺序 何按 | 更新日期: 2024-09-23 04:03:38

我的情况是,我必须编写一个代码来打印给定间隔内所有月份的名称。将有4种显示间隔名称的方式。

(1.)每年(1个周期)

(2.)每半年(6个周期)

(3.)季度(3个周期)

(4.)每月(12个周期)

用户给出3个输入,一个是开始日期,另一个是周期。因此,月份名称显示必须从用户选择的startDate月份开始,并且必须在他输入的周期结束,第三个输入将是checkBoxSelecionStatus,他将在其中输入"Monthly"(12)、"Yearly"(1)、"Quarterly"3)、"Semi-Annually"(6)。因此,这个checkBoxSelecionStatus将决定getMonthByDescription()函数中循环的索引跳过

现在必须输出什么:

(1) 当用户在checkBoxSelecionStatus中选择"Monthly"时,numOfCycles变量的值为12,startDate为3(startDate=3表示从三月一日开始到下一个12个周期(numOfCycle),即下一年的三月)。那么输出应该是在该间隔下的所有12个月。所以输出为:

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

(2) 现在,当用户在周期=12中选择"半自动"时,它必须显示

Mar-Aug
*****
Sept-Feb
*****

(3) 现在,当用户在周期=12中选择"Quaterly"时,它必须显示:

Mar-May
*****
Jun-Aug
*****
Sep-Nov
*****
Dec-Feb
***** 

(4) 现在,当用户在12个周期中选择"每年"时,它必须显示:

Mar-Feb
*****

用户不能输入int startDate=3;总是他可以输入startDate=1;(这里的月份显示将从第一个月开始,也就是Jan),或者他可以输入任何startDate,所以代码必须适用于所有人。

注意:请注意,所需零件在任何情况下都没有错。如果是季度,我必须有3个季度,因为一年中有4个季度的"3"(这是基于我的软件的其他计算),所以当用户选择"季度"时,它必须显示"jan-mar" (if start date is first jan) then apr-jun then jul-sep then oct-dec。类似于每半年一次的jan-jun then jul-dec

如何按以下顺序显示月份名称

这是您改编的代码。它只是将当前间隔提前指定的间隔长度。没有什么特别的:

private static string[] getMonthByDescription(int startMonth, int startYear, int numcycle)
{
    startMonth -= 1; //zero-based index
    int intervalLength = 0;
    switch (checkBoxSelecionStatus)
    {
        case "Monthly": intervalLength = 1; break;
        case "Quarterly": intervalLength = 3; break;
        case "SemiAnually": intervalLength = 6; break;
        case "Yearly": intervalLength = 12; break;
    }
    if (intervalLength == 0)
        throw new ArgumentException();
    int intervals = numcycle / intervalLength;
    string[] arrOfMonthName = new string[intervals];
    for(int i = 0; i < intervals; ++i)
    {
        if (intervalLength > 1)
        {
            var intervalEnd = startMonth + intervalLength - 1;
            var intervalEndYear = startYear;
            if (intervalEnd >= 12)
            {
                intervalEnd -= 12;
                ++intervalEndYear;
            }
            arrOfMonthName[i] = monthNames[startMonth] + " " + startYear + " - " + monthNames[intervalEnd] + " " + intervalEndYear;
        }
        else
            arrOfMonthName[i] = monthNames[startMonth] + " " + startYear;
        startMonth += intervalLength; //go to the next interval
        if (startMonth >= 12)
        {
            startMonth -= 12;
            ++startYear;
        }
    }
    return arrOfMonthName;
}

对于那些可能喜欢不同方法的人,这里是我的"Linqified"版本:

void Main()
{
    int period = 1;
    DateTime start = new DateTime(2016, 3, 1);
    var result = Enumerable.Range(0, 12)
        .Select((i, m) => new { index = i, Month = start.AddMonths(m).ToString("MMMM-yyyy")})
        .GroupBy(o => (o.index) / period);
    foreach (var grp in result)
    {
        if (grp.Count() == 1)
        {
            Console.WriteLine(grp.First().Month);
        }
        else
        {
            Console.WriteLine(string.Format("{0} - {1}", grp.First().Month, grp.Last().Month));
        }
        Console.WriteLine("****");
    }
}

只需更改period变量即可反映您在一段时间内需要多少个月。特殊情况是当周期==1时,输出不是一个范围,而是单个月。

编辑:添加年份