このデモの見方
どのボタンを押しても、確かめてほしいのは次の3つです。 各ボタンの下に「見どころ」を書いてあります。
-
「確定」と「暫定」のバッジが分かれているか。
春分の日と秋分の日は、国立天文台の暦要項が官報に載るまで法的に決まりません。
いま確定しているのは …まで。
その先の日付は計算による予測なので、
このライブラリは
confirmed: falseを付けて返します。 予測を事実と同じ顔で返すライブラリは、外れた年に黙って間違えます - 受け付けない入力を、黙って解釈していないか。 ここが本題です。 祝日ライブラリが日付を1日読み違えても、例外は出ません——違う日の答えが、 自信を持って返ってくるだけです。そのずれは営業日計算に乗ると増幅します。 いちばん下の「入力の受け口」で、 ありがちな書き方を片っ端から試した結果が見られます
-
入力が外に出ていないか。 上の「読み込み後に発生した通信」が
0 件のまま動かないこと
ライブラリを読み込んでいます…
1. 祝日か調べるisHoliday()
日付を入れると、祝日名・種別・確定/暫定を返します。 初期値は …の公式データの外側に してあります——ルールを実装しているので、データが覆っていない年でも答えられる、というのが このライブラリの主張だからです。
2. N営業日後を求めるaddBusinessDays()
土日と祝日を飛ばして数えます。bank を選ぶと、これに加えて
銀行の年末年始休業(12/31〜1/3)も飛ばします。
飛ばした日を理由つきで下に並べます——答えだけ出されても検算できないので。
3. 和暦を変換するtoWareki() / fromWareki()
改元は日単位で切り替わり、月日は繰り越します—— 昭和64年1月7日の翌日は平成元年1月8日であって、平成元年1月1日ではありません。 存在しない和暦の日付(平成31年5月1日など)は、正しくはどの和暦に当たるかまで添えて失敗します。
西暦 → 和暦
和暦 → 西暦
4. 入力の受け口toCivilDate()
このライブラリが受け付ける形と、受け付けない形を、実際に実行した結果です。
受け付けないほうが多いのは手抜きではありません——
2028/3/20 を受けると決めた瞬間、3/20/2028 を
どう読むかも決めなければならず、そこを間違えると例外ではなく違う日付が返ります。
このライブラリは境界を狭く引いて、外側は理由つきで断ります。
タイムゾーン
祝日ライブラリの誤答でいちばん多いのは「1日ずれる」で、これは例外を出さず、
実行した場所によって結果が変わるという形で起きます。
このライブラリの日付演算はすべて日本時間に固定されていて、
Date のローカルタイムゾーン API(getFullYear() など)を使いません。
以下はいまあなたのブラウザで実行した結果です。
このライブラリが「しない」こと
-
確定していない祝日を、確定した祝日として返さない。
春分・秋分の日付は暦要項が官報公表されるまで法的に決まらないので、
…より先は
confirmed: falseです。予測値そのものは返します—— 使えないものを黙って隠すのではなく、確からしさを添えて渡すのが方針です - 対応範囲の外で、それらしい答えを返さない。 祝日判定・営業日計算は …、 和暦変換は明治6年1月1日(1873-01-01)以降です。範囲外は例外になります。 営業日計算の途中で範囲を出た場合も同じです(上の「2.」の最後のボタン)
-
企業・業界独自の休業日は持たない。 カレンダーは
nationalとbankの2種だけです。 取引所や特定業界の休業日は、このライブラリの答えの上に呼び出し側が重ねてください - 法的・金融的な確定情報としては保証しない。 MIT ライセンスの "AS IS" 提供です。このライブラリが保証しているのは 「確定していないものを確定と言わないこと」であって、 「答えが正しいこと」ではありません
使う
npm install japan-calendar@0.1.2
import { isHoliday, addBusinessDays, toWareki, formatWareki } from "japan-calendar";
isHoliday("2028-03-20"); // { name: "春分の日", confirmed: false, ... }
addBusinessDays("2026-12-30", 1, "bank"); // { year: 2027, month: 1, day: 4 }
formatWareki(toWareki("2019-05-01")); // "令和元年5月1日"
依存ゼロ。データは全部同梱で、実行時に外部へ取りに行きません。 Node 20+ / ブラウザ / Cloudflare Workers で動きます。