JavaScript

「DateTimePicker」で平日の指定時間だけを選択可能にする方法

JavaScript
この記事は約7分で読めます。

フォームの日時選択欄によく使用される「DateTimePicker」。
作成するサイトによっては営業日だけ、営業時間だけを選択できるようにしたいこともありますよね。

今回はそんなサイトでコピペで使える、平日の指定時間だけを選択可能にする方法を紹介します!

実装方法

DateTimePickerの設定方法は割愛させていただいて、今回の平日の指定時間だけを選択可能にする実装コードを早速紹介します。

[#date_input]というidが付与された入力欄に設定するためのコードがこちら。

<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-datetimepicker@2.5.20/build/jquery.datetimepicker.full.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery-datetimepicker@2.5.20/build/jquery.datetimepicker.min.css">

<script>
jQuery(function($){
  const options = {
    format: 'Y-m-d H:i', // 日付のフォーマット
    step: 30,
    disabledWeekDays: [0, 6], // 土日を無効化
    allowTimes: generateAllowedTimes('10:00', '18:00', 30) // 指定した時間を30分刻みで設定
  };

  $('#date_input').datetimepicker(options);

  function generateAllowedTimes(start, end, intervalMinutes) {
    const times = [];
    const [startHour, startMin] = start.split(':').map(Number);
    const [endHour, endMin] = end.split(':').map(Number);
    const startDate = new Date(0, 0, 0, startHour, startMin);
    const endDate = new Date(0, 0, 0, endHour, endMin);

    while (startDate <= endDate) {
      const hours = String(startDate.getHours()).padStart(2, '0');
      const mins = String(startDate.getMinutes()).padStart(2, '0');
      times.push(`${hours}:${mins}`);
      startDate.setMinutes(startDate.getMinutes() + intervalMinutes);
    }

    return times;
  }
});
</script>

デフォルトの設定では制御しきれない部分があるためjsで細かい設定を組み生成しています。

[options]内の指定を変えるだけで、日付のフォーマットや無効化の曜日、時間の範囲を設定できます。(日付は日曜が0、土曜日が6になるため、間の曜日を指定する場合はそこの数字を変更してください。)

日本語対応する場合

上記のコードのままでは英語になってしまうため、日本語化をしたいと思います。

違うjsを読み込めば変えられるというのもありますが…今回はそこまで手をかけず、js側で置換します。

See the Pen Untitled by Ayane (@ayane_cmn) on CodePen.

<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-datetimepicker@2.5.20/build/jquery.datetimepicker.full.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery-datetimepicker@2.5.20/build/jquery.datetimepicker.min.css">

<script>
jQuery(function($){

  $.datetimepicker.setLocale('ja');// 日本語ローカライズの定義

  const options = {
    format: 'Y年m月d日 H:i', // 日付のフォーマット
    step: 30,
    disabledWeekDays: [0, 6], // 土日を無効化
    allowTimes: generateAllowedTimes('10:00', '18:00', 30), // 指定した時間を30分刻みで設定
    i18n: {
      ja: {
        months: [
          '1月','2月','3月','4月','5月','6月',
          '7月','8月','9月','10月','11月','12月'
        ],
        dayOfWeek: [
          '日', '月', '火', '水', '木', '金', '土'
        ]
      }
    }
  };

  $('#date_input').datetimepicker(options);

  function generateAllowedTimes(start, end, intervalMinutes) {
    const times = [];
    const [startHour, startMin] = start.split(':').map(Number);
    const [endHour, endMin] = end.split(':').map(Number);
    const startDate = new Date(0, 0, 0, startHour, startMin);
    const endDate = new Date(0, 0, 0, endHour, endMin);

    while (startDate <= endDate) {
      const hours = String(startDate.getHours()).padStart(2, '0');
      const mins = String(startDate.getMinutes()).padStart(2, '0');
      times.push(`${hours}:${mins}`);
      startDate.setMinutes(startDate.getMinutes() + intervalMinutes);
    }

    return times;
  }
});
</script>

まとめ

フォームの入力欄の仕様に凝り始めると何かと手がかかりますが、一手間加わっているとユーザーにとっては使いやすいサイトになりますよね。

私自身もユーザーとして使う時「お!このフォームの仕様は今度真似しよう!」と思うことがよくあります。

フォームの仕様…もっと突き詰めていきたいです!笑

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