我如何发现给定日期的四分之一

时间:2012-01-02 07:10:45

标签: c#

以下是一个财政年度的季度

April to June          - Q1
July to Sep            - Q2
Oct to Dec             - Q3
Jan to March           - Q4

如果输入日期的月份如上所述,我需要以季度数字表示输出。

例如,

如果我提供输入日期(比如 1月2日),我需要输出为Q4

如果我将输入设为( Jun 5 ),则输出应为Q1

根据输入日期,我需要季度数字。

11 个答案:

答案 0 :(得分:22)

您可以简单地将扩展方法写入DateTime

public static int GetQuarter(this DateTime date)
{
    if (date.Month >= 4 && date.Month <= 6)
        return 1;
    else if (date.Month >= 7 && date.Month <= 9)
        return 2;
    else if (date.Month >= 10 && date.Month <= 12)
        return 3;
    else 
        return 4;
}

并将其用作

DateTime dt = DateTime.Now;
dt.GetQuarter();

答案 1 :(得分:14)

这是“正常年份”。我想你可以调整样本:

string.Format("Q{0}", (date.Month + 2)/3);

答案 2 :(得分:11)

public static int GetQuarter(DateTime date)
{
    int[] quarters = new int[] { 4,4,4,1,1,1,2,2,2,3,3,3 };
    return quarters[date.Month-1];
}

答案 3 :(得分:9)

实现这一目标的最简单一致的方法:

<强>正

Math.Ceiling(date.Month / 3.0)

财政(刚刚向上移动了2 + 1个季度)

Math.Ceiling(date.Month / 3.0 + 2) % 4 + 1
01.01.2016 00:00:00 -> Q1 -> FQ4
01.02.2016 00:00:00 -> Q1 -> FQ4
01.03.2016 00:00:00 -> Q1 -> FQ4
01.04.2016 00:00:00 -> Q2 -> FQ1
01.05.2016 00:00:00 -> Q2 -> FQ1
01.06.2016 00:00:00 -> Q2 -> FQ1
01.07.2016 00:00:00 -> Q3 -> FQ2
01.08.2016 00:00:00 -> Q3 -> FQ2
01.09.2016 00:00:00 -> Q3 -> FQ2
01.10.2016 00:00:00 -> Q4 -> FQ3
01.11.2016 00:00:00 -> Q4 -> FQ3
01.12.2016 00:00:00 -> Q4 -> FQ3

结果是介于1和4之间的值。几乎任何环境都有CEIL函数,所以这也适用于任何语言。

答案 4 :(得分:6)

int CurrentQuarter = (int)Math.Floor(((decimal)DateTime.Today.Month + 2) / 3);

或将DateTime.Today更改为所需日期。

答案 5 :(得分:6)

扩展方法和较少的比较:

public static class DateTimeExtension
{
    public static int GetQuarter(this DateTime dateTime)
    {
        if (dateTime.Month <= 3)
            return 1;

        if (dateTime.Month <= 6)
            return 2;

        if (dateTime.Month <= 9)
            return 3;

        return 4;
    }
}

答案 6 :(得分:3)

在sql中,它只是

((((month(@mydate)-1)/3)+3) % 4) + 1

用它来检查:

declare @mydate datetime
set @mydate = '2011-01-01'
while @mydate <= '2011-12-31'
    begin
    print ((((month(@mydate)-1)/3)+3) % 4) + 1
    set @mydate = dateadd(month, 1, @mydate)
    end

或者如果你想在.net中这样做,就像

String.Format("Q{0}", ((((date.Month-1)/3)+3) % 4) + 1);

答案 7 :(得分:1)

既然你在 C# 中有关系模式,它可以很容易地用单个 switch 表达式编写

public static string FiscalQuarter(this DateTime date)
{
    var qtr = date.Month switch
    {
        < 4 => 4,
        < 7 => 1,
        < 10 => 2,
        _ => 3
    };
    return $"Q{qtr}";
}

答案 8 :(得分:0)

你可以这样做:

Scott Meyers

输出将是: enter image description here

答案 9 :(得分:0)

此方法允许您指定季度的开始月份,并提供整个期间的年份。

    public string GetQuarterPeriod(DateTime date, int quarterStartMonth)
    {
        var quarterDateOffset = date.AddMonths(1 - quarterStartMonth);
        return $"Q{Math.Ceiling((decimal)quarterDateOffset.Month / 3)} {quarterDateOffset.Year}" 
               + (quarterStartMonth == 1 ? "" : $"/{quarterDateOffset.Year + 1}");
    }

,并提供:

GetQuarterPeriod(new DateTime(2018, 4, 1), 4) -> "Q1 2018/2019"
GetQuarterPeriod(new DateTime(2018, 1, 1), 1) -> "Q1 2018"

功能说明如果月份是1月(1),则约束为一年。

答案 10 :(得分:0)

我来这里的目的是为给定的季度和年份的第一天创建一个DateTime(这可以理解为与上述问题相反,但相关),并采用了@wezzix的答案来创建: / p>

public DateTime GetFirstDayOfQuarterFromYearAndQuarter(int year, int quarter)
{
    var month = 3 * quarter - 2;

    return new DateTime(year, month, 1);
}