【JavaScript】出荷日を算出する処理

めだま

ECサイトとかでよく見る、「○○月○○日」に出荷という文言の日付を動的に算出するJavaScript処理を書いてみた

今回の条件

今回の算出条件はこんな感じ

  • 営業日かつ12時までの注文は当日発送
  • 休日の場合は翌営業日発送
  • ソースでは、休日 (曜日)休日 (日付) の両方を設定できる

ソース

<p>今注文すると<span id="shipDate"></span>の出荷です</p>

<script>
  // 即日発送締め切り時間
  const limitHour = 12
  // 休日 (日付)
  const holidayDate = [
    '2021/1/1',
    '2021/1/2',
    '2021/1/3',
  ]
  // 休日 (曜日)
  const holidayWeek = [
    '土',
    '日',
  ]
  // 定休日を格納する
  let shipDate = null
  // ベースとなる日 (=今日)
  const baseDate = new Date()
  // 現在時刻
  const hours = baseDate.getHours()

  // 営業日 && 12時までの注文は当日出荷
  if (!isHoliday(baseDate) && hours < limitHour) {
    shipDate = baseDate
  } else {
    // 定休日を算出する
    do {
      // 1日ずつ加算
      baseDate.setDate(baseDate.getDate() + 1);
      // 休日でない場合
      if (!isHoliday(baseDate)) {
        shipDate = baseDate
      }
    } while (shipDate === null)
  }

  if (shipDate !== null) {
    // 出荷日をHTMLに反映
    document.getElementById('shipDate').innerText = formatDate(shipDate, 'YYYY年MM月DD日')
  }

  /**
   * 休日かどうか判定する
   * @return boolean
   */
  function isHoliday(date) {
    const week = date.getDay()
    const weekString = ['日', '月', '火', '水', '木', '金', '土' ][week]
    return holidayDate.includes(formatDate(date, 'YYYY/MM/DD'))
          || holidayWeek.includes(weekString)
  }

  /**
   * 日付をフォーマットする
   * @param date
   * @param format
   * @returns {*}
   */
  function formatDate(date, format) {
    format = format.replace(/YYYY/, date.getFullYear());
    format = format.replace(/MM/, date.getMonth() + 1);
    format = format.replace(/DD/, date.getDate());
    return format;
  }
</script>