はじめに 「四半期判定」は“月をざっくり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四半期」
というルールにしたいとします。
このときの考え方はシンプルで、
- 「年度の開始月」を基準に月をずらす
- ずらした月に対して、さきほどの
(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# コードの中に気持ちよく組み込めるようになります。
