給定起止日期,按自然周 (週一~週日) 計算周數。起始日若非週一則不計該周,結束日哪怕是週一也算一周。
Math.ceil(diffMs / (7 * 24 * 3600 * 1000))。function countNaturalWeeks(start, end) {
// start, end 為 Date 對象
var s = new Date(start);
var e = new Date(end);
// 調整到週一 (getDay: 0=Sun, 1=Mon...)
var day = s.getDay();
var diff = (day === 1) ? 0 : (8 - day); // 到下一個週一的天數
s.setDate(s.getDate() + diff);
if (s > e) return 0;
var msPerWeek = 7 * 24 * 3600 * 1000;
return Math.ceil((e - s) / msPerWeek);
}
// 測試
console.log(countNaturalWeeks(new Date(2023,0,2), new Date(2023,0,8))); // 1 (週一~週日)
console.log(countNaturalWeeks(new Date(2023,0,3), new Date(2023,0,8))); // 1 (週二開始,調整到下週一已超過結束日? 需確認邏輯)
若起始日為週二,調整到下週一可能超過結束日,返回 0 符合「不計不完整周」語義。具體業務可微調。