C# Tips | 日付・時間処理:四半期判定

C# C#
スポンサーリンク

はじめに 「四半期判定」は“月をざっくり4つに区切るラベル付け”

「この売上は第何四半期?」「四半期ごとの集計を出したい」「決算Q1〜Q4でグラフを描きたい」
こういう“3ヶ月単位”の世界で必ず必要になるのが「四半期判定」です。

C# で四半期を判定するのは、とてもシンプルです。
基本は「月を見て、1〜3月なら第1四半期、4〜6月なら第2四半期…」というだけです。
ただし、実務では「年度の開始月が4月」「決算期が10月始まり」など、
“どこから四半期を数えるか”を変えたい場面もよくあります。

ここでは、まず「暦年ベースの四半期」、次に「年度開始月を変えた四半期」、
最後に「ユーティリティとしての設計ポイント」という流れで、
初心者向けにかみ砕いて説明していきます。


基本:暦年ベースの四半期判定(1〜3月がQ1)

月から四半期を求める一番シンプルな方法

まずは「1〜3月が第1四半期、4〜6月が第2四半期…」という、
暦年ベースの一番オーソドックスな四半期判定です。

public static class QuarterUtil
{
    public static int GetQuarter(DateTime date)
    {
        int month = date.Month;

        if (month >= 1 && month <= 3)
        {
            return 1; // 第1四半期
        }
        else if (month >= 4 && month <= 6)
        {
            return 2; // 第2四半期
        }
        else if (month >= 7 && month <= 9)
        {
            return 3; // 第3四半期
        }
        else
        {
            return 4; // 第4四半期(10〜12月)
        }
    }
}
C#

使い方の例です。

Console.WriteLine(QuarterUtil.GetQuarter(new DateTime(2026, 1, 10)));  // 1
Console.WriteLine(QuarterUtil.GetQuarter(new DateTime(2026, 4, 1)));   // 2
Console.WriteLine(QuarterUtil.GetQuarter(new DateTime(2026, 7, 31)));  // 3
Console.WriteLine(QuarterUtil.GetQuarter(new DateTime(2026, 11, 5)));  // 4
C#

ここでの重要ポイントは、「四半期は“月だけ見ればいい”」ということです。
日付や時刻は関係なく、date.Month さえ分かれば判定できます。


もう一歩スマートに:整数演算で四半期を求める

if を減らして式で書く

同じロジックを、少し“数式っぽく”書くこともできます。

public static int GetQuarterByFormula(DateTime date)
{
    return ((date.Month - 1) / 3) + 1;
}
C#

月を 1〜12 として考えると、

1〜3 → (0〜2) / 3 = 0 → +1 で 1
4〜6 → (3〜5) / 3 = 1 → +1 で 2
7〜9 → (6〜8) / 3 = 2 → +1 で 3
10〜12 → (9〜11) / 3 = 3 → +1 で 4

という具合に、きれいに四半期番号が出てきます。

if のほうが直感的に感じるならそれでOKですが、
「月→四半期は (month - 1) / 3 + 1」というパターンを頭の片隅に置いておくと、
LINQ などで集計するときに便利です。


応用:年度開始月を変えた四半期判定(例:4月始まり)

「4〜6月がQ1」「7〜9月がQ2」などの世界

日本の多くの会社では、「年度」が4月始まりだったりします。
この場合、「四半期」もそれに合わせてずらしたくなることがあります。

例えば、「4〜6月を第1四半期、7〜9月を第2四半期、10〜12月を第3四半期、1〜3月を第4四半期」
というルールにしたいとします。

このときの考え方はシンプルで、

  1. 「年度の開始月」を基準に月をずらす
  2. ずらした月に対して、さきほどの (month - 1) / 3 + 1 を使う

という2ステップです。

public static int GetQuarterWithStartMonth(DateTime date, int startMonth)
{
    if (startMonth < 1 || startMonth > 12)
    {
        throw new ArgumentOutOfRangeException(nameof(startMonth));
    }

    int month = date.Month;

    int shifted = ((month - startMonth + 12) % 12) + 1;

    return ((shifted - 1) / 3) + 1;
}
C#

ここでやっていることを言葉で整理すると、

  • month - startMonth で「開始月から何ヶ月ずれているか」を出す
  • + 12 してから % 12 することで、マイナスにならないように 0〜11 に正規化する
  • + 1 して 1〜12 に戻す
  • あとは通常の四半期計算と同じ

という流れです。

4月始まりの例を見てみましょう。

int startMonth = 4; // 4月始まり

Console.WriteLine(GetQuarterWithStartMonth(new DateTime(2026, 4, 1),  startMonth)); // 1
Console.WriteLine(GetQuarterWithStartMonth(new DateTime(2026, 6, 30), startMonth)); // 1
Console.WriteLine(GetQuarterWithStartMonth(new DateTime(2026, 7, 1),  startMonth)); // 2
Console.WriteLine(GetQuarterWithStartMonth(new DateTime(2026, 10, 1), startMonth)); // 3
Console.WriteLine(GetQuarterWithStartMonth(new DateTime(2027, 1, 1),  startMonth)); // 4
C#

ここでの重要ポイントは、「四半期の定義を“開始月”でパラメータ化している」ことです。
これにより、「4月始まり」「10月始まり」など、会社ごとの決算期にも柔軟に対応できます。


四半期+年(または年度)をまとめた型にする

「2026年Q2」「2024年度Q3」のように扱いたい

実務では、「四半期番号だけ」ではなく、
「どの年の第何四半期か」をセットで扱うことが多いです。

暦年ベースなら、「年+四半期」をまとめた小さな struct を作ると便利です。

public readonly struct QuarterOfYear
{
    public int Year { get; }
    public int Quarter { get; }

    public QuarterOfYear(int year, int quarter)
    {
        if (quarter < 1 || quarter > 4)
        {
            throw new ArgumentOutOfRangeException(nameof(quarter));
        }

        Year = year;
        Quarter = quarter;
    }

    public override string ToString() => $"{Year}年Q{Quarter}";
}
C#

これを DateTime から作るユーティリティです。

public static QuarterOfYear GetQuarterOfYear(DateTime date)
{
    int q = QuarterUtil.GetQuarter(date);
    return new QuarterOfYear(date.Year, q);
}
C#

使い方の例です。

var q = GetQuarterOfYear(new DateTime(2026, 5, 10));
Console.WriteLine(q); // 2026年Q2
C#

年度ベース(例:4月始まり)で扱いたい場合は、
「年度の年」と「四半期」をセットにした struct を用意します。

public readonly struct FiscalQuarter
{
    public int FiscalYear { get; }
    public int Quarter { get; }

    public FiscalQuarter(int fiscalYear, int quarter)
    {
        if (quarter < 1 || quarter > 4)
        {
            throw new ArgumentOutOfRangeException(nameof(quarter));
        }

        FiscalYear = fiscalYear;
        Quarter = quarter;
    }

    public override string ToString() => $"{FiscalYear}年度Q{Quarter}";
}
C#

4月始まりの年度四半期を求める例です。

public static FiscalQuarter GetFiscalQuarter(DateTime date, int startMonth)
{
    int quarter = GetQuarterWithStartMonth(date, startMonth);

    int fiscalYear = date.Year;
    if (date.Month < startMonth)
    {
        fiscalYear -= 1;
    }

    return new FiscalQuarter(fiscalYear, quarter);
}
C#

使い方の例です。

int startMonth = 4; // 4月始まり

Console.WriteLine(GetFiscalQuarter(new DateTime(2026, 4, 1),  startMonth)); // 2026年度Q1
Console.WriteLine(GetFiscalQuarter(new DateTime(2027, 1, 1),  startMonth)); // 2026年度Q4
Console.WriteLine(GetFiscalQuarter(new DateTime(2027, 4, 1),  startMonth)); // 2027年度Q1
C#

ここでの重要ポイントは、「暦年」と「年度」を型レベルで分けている」ことです。
これをやっておくと、「2026年Q1」と「2026年度Q1」を取り違える事故を防ぎやすくなります。


実務での注意点:定義を“コードに刻む”

「四半期の定義が人によって違う」を防ぐ

四半期判定はロジック自体は簡単ですが、
怖いのは「人によって定義が違う」ことです。

ある画面では暦年ベース、別のバッチでは年度ベース、
さらに別のレポートでは決算期ベース…というように、
バラバラに if 文を書き始めると、必ずどこかで食い違いが出ます。

なので、実務では次のような方針を取るのがおすすめです。

  • 「暦年四半期」「年度四半期」「決算四半期」など、概念ごとにユーティリティを分ける
  • 「開始月」を引数に取る汎用版を用意しつつ、会社標準の開始月をラップしたメソッドも用意する
  • 「年+四半期」を表す小さな型を作り、そこに意味を閉じ込める

こうしておくと、「四半期の定義」がコードの中で一箇所に集約され、
ビジネスルールの変更にも強くなります。


まとめ 「四半期判定ユーティリティ」は“3ヶ月の塊に名前を付ける道具」

四半期判定は、見た目はとてもシンプルですが、
「暦年か年度か」「開始月は何月か」「年とセットでどう表現するか」など、
ビジネスルールのエッセンスが詰まったテーマです。

押さえておきたいポイントを整理すると、こうなります。

四半期は「月だけ見ればよく」、暦年ベースなら (month - 1) / 3 + 1 で求められる。
年度や決算期に合わせたいときは、「開始月」を基準に月をずらしてから同じ式を使う。
「年+四半期」を表す小さな型(暦年用と年度用)を用意すると、意味の取り違えを防ぎやすい。
四半期の定義(暦年/年度/開始月)はユーティリティに閉じ込め、あちこちでバラバラに if 文を書かない。

ここまで押さえておけば、
「なんとなく Q1〜Q4 を付けている」状態から一歩進んで、
“ビジネスの3ヶ月単位の区切りを正しく表現できる、実務で使える四半期判定ユーティリティ”を
自分の C# コードの中に気持ちよく組み込めるようになります。

タイトルとURLをコピーしました