今回の条件
今回の算出条件はこんな感じ
- 営業日かつ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>
ECサイトとかでよく見る、「○○月○○日」に出荷という文言の日付を動的に算出するJavaScript処理を書いてみた