祝日判定のできるflatpickrをつくってみた

2023.10.06

どうもこんにちは塚本です。
今日は祝日の判定ができる日付ピッカーをつくったお話をしようと思います。

Web開発において、日付ピッカーの実装は見かけ以上に複雑です。
僕はflatpickrという軽量なjsライブラリを使うことが多いです。

土日祝だけは営業時間が変わる!みたいなシチュエーションは多く、特に祝日は年ごとに変わることもあるので、これに悩んできた開発者は多いのではないでしょうか…?

jQueryも使っていないので参考になれば嬉しいです。

土日の判定

土日の判定はとても簡単で、以下の関数で実現できます。

const isWeekend = (date) => {
  const dayOfWeek = date.getDay(); // 0が日曜日、6が土曜日

  // 土曜日または日曜日の場合はtrueを返す
  return dayOfWeek === 0 || dayOfWeek === 6;
}

使用例はこちらになります。

// 使用例
const targetDate = new Date('2023-10-06'); // 2023年10月6日(土曜日)
if (isWeekend(targetDate)) {
  alert("指定した日は土日です!");
} else {
  alert("指定した日は平日です。");
}

祝日の判定

祝日の判定については、祝日のリストを取得しその日付と照らし合わせて判定します。
リストの取得にはこちらのAPIを使わせていただいております。

const isHoliday = (date) => {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        
        xhr.open("GET", "https://holidays-jp.github.io/api/v1/date.json", true);
        
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    const holidays = JSON.parse(xhr.responseText);
                    if (date in holidays) {
                        resolve(true);
                    } else {
                        resolve(false);
                    }
                } else {
                    reject("データの取得に失敗しました");
                }
            }
        };
        
        xhr.send();
    });
};

非同期でやり取りしています。
使用例はこちらになります。

// 使用例
const targetDate = '2023-10-09'; // 2023年10月9日(スポーツの日)
isHoliday(targetDate)
    .then((result) => {
        if (result) {
            alert("指定した日は祝日です");
        } else {
            alert("指定した日は祝日ではありません");
        }
    })
    .catch((error) => {
        console.error(error);
    });

これら二つの関数を使うだけで、簡単に土日祝の判定が可能です。
さっそくflatpickrに組み込んでいきましょう。

祝日判定ができるflatpickr

以下のCodePenで日付を選んでいただくと、祝日判定が可能です。

土日祝の場合はカレンダーの色を変える

flatpickrにはonDayCreateというフックがあるので、それを用いることで全ての「日」ごとに処理を追加することができます。

仕組み

onDayCreatechange_holiday_bg_colorという関数を渡しています。
中身はこの記事の前半で説明した関数になります。

flatpickr("#flatpickr", {
    onDayCreate: change_holiday_bg_color
});
// カレンダーの日付要素に土日祝クラスを付与する関数
const change_holiday_bg_color = (dObj, dStr, fp, dayElem) => {
    // 祝日クラス付与
    isHoliday(dayElem.dateObj)
        .then((result) => {
            if (result) {
                dayElem.classList.add("holiday");
            }
        })
        .catch((error) => {
            console.error(error);
        });

    // 土日クラス付与
    let dayOfWeek = dayElem.dateObj.getDay();
    switch (dayOfWeek) {
        case 0:
            dayElem.classList.add("sunday");
            break;
        case 6:
            dayElem.classList.add("saturday");
            break;
    }
};

詳しくはCodePenの中身を見てください。

まとめ

判定関数を作っておくだけで、flatpickrのみならず、汎用的に使うことができます。
jQueryも使っていないので基本的にコピペで動くと思います!

ぜひ、カスタマイズして開発に活かしてくださいm(_ _)m


🏢 株式会社ハジメクリエイトについて

この記事は、 株式会社ハジメクリエイト のエンジニアが執筆しました。


💻 Webシステム開発のプロフェッショナル

私たちは、ビジネスの成長をサポートするため、 PHPを用いたオーダーメイドのシステム開発 を提供しています。
お客様一人ひとりのニーズに応じたカスタムシステムを、 企画から開発・運用まで一貫してサポート
さらに、 React Nativeを活用したiOS/Android対応のアプリ開発 も得意としています。

単に「作る」だけでなく、
課題の本質に向き合い、最適な解決策を提案する のがハジメクリエイトのスタイルです。


🧑‍💻 一緒に働く仲間を探しています!

株式会社ハジメクリエイトでは、 自ら考え行動できるエンジニア を募集しています。
「私はこれがしたい!」という想いを持つあなた、一緒にモノづくりを楽しみませんか?

  • 技術で人の役に立ちたい
  • 意見が通る小さなチームで働きたい
  • フロントエンドもバックエンドも、いろいろ挑戦してみたい
  • お客さんと一緒にプロジェクトを育てたい

そんな気持ちがある方なら、きっと居心地のいい環境だと思います。
正社員はもちろん、パートタイムでの参加も歓迎中! 柔軟な関わり方で、あなたらしく働いてください。

👉 採用情報を見る
👉 お問い合わせはこちら


ちょっとでも「この会社、気になるな」と思ったら、ぜひお気軽にご連絡ください📩
最後まで読んでいただきありがとうございました!

  • JavaScript
  • Web技術

この記事を書いた人

Sho Tsukamoto

Chief Engineer Sho Tsukamoto

2023年4月入社。Web職人のたまごです。 最近はもっぱらコーディングすることは少なく、LaravelやReact Nativeを用いたシステム開発をメインとしています。

Sho Tsukamotoの書いた記事一覧へ

ハジメクリエイトでは一緒に働く仲間を募集しています!

関連記事