有人可以检查一下这个代码吗?倒计时截止时间为下午 2 点,但不包括周末和英国银行假期

问题描述 投票:0回答:1

这个论坛的新手。我已经为此绞尽脑汁有一段时间了,但就是无法让它按我想要的方式工作。

基本上,我创建了一个倒计时器,我想每天下午 2 点重置它,并发送如下消息:“使用‘倒计时’计时器订购,在‘日期’前收到”

因此,它的失败之处在于,我似乎无法让它跳过周末或英国银行假期,并且随着下周一的英国银行假期,如果我能够对其进行全面测试并正常工作,那就太好了。

因此,如果有人今天订购并在明天(5 月 2 日星期四)下午 2 点之前订购,他们将在 2024 年 5 月 3 日星期五收到商品。这一切正常!

但是,当时间为英国 5 月 3 日星期五下午 2 点格林威治标准时间时,它应该显示“receive by Tuesday 7th May 2024”。如果本周末不是英国银行假日,则应显示“receive by Monday 6th May”。

周末,最好倒计时到本周六下午 2 点,并告诉客户“5 月 7 日星期二之前收到”。周日、5 日和周一 6 日也是如此,前提是他们在下午 2 点之前订购!

在没有银行假日的任何其他周末,它应该告诉客户:-

  1. 5 月 10 日星期五下午 2 点之前,“5 月 13 日星期一之前收到。”
  2. 5 月 10 日星期五下午 2 点后,“5 月 14 日星期二之前收到。”
  3. 5 月 11 日星期六下午 2 点后,“5 月 14 日星期二之前收到。”
  4. 5 月 12 日星期日下午 2 点后,“5 月 14 日星期二之前收到。”
  5. 5 月 13 日星期一下午 2 点之前,“5 月 14 日星期二之前收到。”
  6. 5 月 13 日星期一下午 2 点后,“5 月 15 日星期三之前收到。”
  7. 5 月 14 日星期二下午 2 点之前,“5 月 15 日星期三之前收到。”

等等。

任何指针或超级天才都可以帮助我调整代码,因为我似乎已经尝试了一切。

我不会说我认为这是不可能的,因为我相信没有什么是不可能的。这超出了我的技能范围!!!

< script >
  // UK Bank Holidays between now and 2027
  var bankHolidays = ["2024-05-06", "2024-05-27", "2024-08-26", "2024-12-25", "2024-12-26", "2025-01-01", "2025-04-18", "2025-04-21", "2025-05-05", "2025-05-26", "2025-08-25", "2025-12-25", "2025-12-26", "2026-01-01", "2026-04-03", "2026-04-06", "2026-05-04", "2026-05-25", "2026-08-31", "2026-12-25", "2026-12-28"];

// Get today's date and time
var now = new Date();

// Set the countdown date and time to 2 PM today
var countDownDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 14, 0, 0, 0);

// If it's past 2 PM, set the countdown date and time to 2 PM tomorrow
if (now > countDownDate) {
  countDownDate.setDate(countDownDate.getDate() + 1);
}

// Calculate the delivery day
var deliveryDay = new Date(countDownDate);
// If the order is placed up until 2 PM on Wednesday, the delivery day is Friday
// If the order is placed after 2 PM on Wednesday, the delivery day is Monday
if (deliveryDay.getDay() <= 4) {
  deliveryDay.setDate(deliveryDay.getDate() + (5 - deliveryDay.getDay()));
} else {
  deliveryDay.setDate(deliveryDay.getDate() + ((8 - deliveryDay.getDay()) % 7));
}

// If the delivery day is a bank holiday, postpone it to the next day
while (bankHolidays.includes(deliveryDay.toISOString().split('T')[0])) {
  deliveryDay.setDate(deliveryDay.getDate() + 1);
}

// Update the delivery day element
document.getElementById("deliveryDay").innerHTML = deliveryDay.toDateString();

// Update the countdown timer every 1 second
var x = setInterval(function() {

  // Get today's date and time
  var now = new Date().getTime();

  // Find the distance between now and the countdown date
  var distance = countDownDate - now;

  // Time calculations for hours, minutes and seconds
  var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = Math.floor((distance % (1000 * 60)) / 1000);

  // Output the result in the timer element
  document.getElementById("timer").innerHTML = hours + "h " + minutes + "m " + seconds + "s ";

  // If the countdown is over, reset the countdown date and time to 2 PM tomorrow and recalculate the delivery day
  if (distance < 0) {
    countDownDate.setDate(countDownDate.getDate() + 1);
    if (countDownDate.getDay() <= 3) {
      deliveryDay.setDate(deliveryDay.getDate() + (5 - deliveryDay.getDay()));
    } else {
      deliveryDay.setDate(deliveryDay.getDate() + ((8 - deliveryDay.getDay()) % 7));
    }
    while (bankHolidays.includes(deliveryDay.toISOString().split('T')[0])) {
      deliveryDay.setDate(deliveryDay.getDate() + 1);
    }
    document.getElementById("deliveryDay").innerHTML = deliveryDay.toDateString();
  }
}, 1000); <
/script>
<div>
  <h3>Order within <span class="countdown" id="timer"></span> to receive *<span class="deliverydate" id="deliveryDay"></span></h3>
</div>
<div>
  <h4>*Exclusions apply. Click <a href="/despatch-delivery-information" id="deliverydaysmall">HERE</a> for full details or if your item is time critical.</h4>
</div>
<script src="https://bp215.bluepark.build/user/countdowntest.js"

javascript
1个回答
0
投票

你可以尝试这个代码吗我希望它能解决你的问题

// UK Bank Holidays between now and 2027
var bankHolidays = ["2024-05-06", "2024-05-27", "2024-08-26", "2024-12-25", "2024-12-26", "2025-01-01", "2025-04-18", "2025-04-21", "2025-05-05", "2025-05-26", "2025-08-25", "2025-12-25", "2025-12-26", "2026-01-01", "2026-04-03", "2026-04-06", "2026-05-04", "2026-05-25", "2026-08-31", "2026-12-25", "2026-12-28"];

// Get today's date and time
var now = new Date();

// Set the countdown date and time to 2 PM today
var countDownDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 14, 0, 0, 0);

// If it's past 2 PM, set the countdown date and time to 2 PM tomorrow
if (now > countDownDate) {
  countDownDate.setDate(countDownDate.getDate() + 1);
}

// Calculate the delivery day
var deliveryDay = new Date(countDownDate);

// Function to check if a date is a weekend
function isWeekend(date) {
  var day = date.getDay();
  return day === 0 || day === 6;
}

// Function to check if a date is a UK Bank Holiday
function isBankHoliday(date) {
  var isoDate = date.toISOString().split('T')[0];
  return bankHolidays.includes(isoDate);
}

// Adjust delivery day for weekends and bank holidays
while (isWeekend(deliveryDay) || isBankHoliday(deliveryDay)) {
  deliveryDay.setDate(deliveryDay.getDate() + 1);
}

// Update the delivery day element
document.getElementById("deliveryDay").innerHTML = deliveryDay.toDateString();

// Update the countdown timer every 1 second
var x = setInterval(function() {

  // Get today's date and time
  var now = new Date().getTime();

  // Find the distance between now and the countdown date
  var distance = countDownDate - now;

  // Time calculations for hours, minutes and seconds
  var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = Math.floor((distance % (1000 * 60)) / 1000);

  // Output the result in the timer element
  document.getElementById("timer").innerHTML = hours + "h " + minutes + "m " + seconds + "s ";

  // If the countdown is over, reset the countdown date and time to 2 PM tomorrow and recalculate the delivery day
  if (distance < 0) {
    countDownDate.setDate(countDownDate.getDate() + 1);
    
    // Reset delivery day and adjust for weekends and bank holidays
    deliveryDay = new Date(countDownDate);
    while (isWeekend(deliveryDay) || isBankHoliday(deliveryDay)) {
      deliveryDay.setDate(deliveryDay.getDate() + 1);
    }
    
    // Update delivery day element
    document.getElementById("deliveryDay").innerHTML = deliveryDay.toDateString();
  }
}, 1000);

© www.soinside.com 2019 - 2024. All rights reserved.