2017-01-07 2 views
0

У меня есть DateJS, настроенный на моем веб-сайте, чтобы дать пользователям возможность узнать, когда они получат свой пакет.DateJS - Не включать недельные дни

Я использую скрипт DateJS для этого.

Мне нужно изменить сценарий, чтобы он не включал выходные дни при оценке дня доставки.

Например, сегодня (пятница), если кто-то выбирает одно из следующих действий:

Следующего дня воздуха: он должен показать в понедельник, а не в субботу Двухдневного Air: Он должен показать во вторник, а не в воскресенье Три дня Воздух: он должен появляться в среду, а не в понедельник

Помощь приветствуется.

<div class="panel-body"> 
    <table class="table table-striped"> 
     <thead> 
      <th>Shipping Method</th> 
      <th>Estimated Delivery</th> 
     </thead> 
     <tbody> 
      <tr> 
      <td>3 Day Select</td> 
      <td><span class="fromDate-1"></span> 
      <script> 
       var fromDate = Date.today().addDays(3); 
       if (fromDate.is().saturday() || fromDate.is().sunday()) 
       fromDate = fromDate.next().monday(); 
       $('.fromDate-1').html(fromDate.toString('dddd MMMM dS')); 
      </script> 
      </td> 
      </tr> 
      <tr> 
      <td>2nd Day Air</td> 
      <td><span class="fromDate-2"></span> 
       <script> 
       var fromDate = Date.today().addDays(2); 
       if (fromDate.is().saturday(1) || fromDate.is().sunday()) 
       fromDate = fromDate.next().monday(); 
       $('.fromDate-2').html(fromDate.toString('dddd MMMM dS')); 
       </script> 
      </td> 
      </tr> 
      <tr> 
      <td>Next Day Air</td> 
      <td> 
       <span class="fromDate-3"></span> 
       <script> 
        var fromDate = Date.today().addDays(1); 
        if (fromDate.is().saturday() || fromDate.is().sunday()) 
        fromDate = fromDate.next().monday(); 
        $('.fromDate-3').html(fromDate.toString('dddd MMMM dS')); 
       </script> 
       </td> 
      </tr> 
      </tbody> 
     </table> 
    </div> 

ответ

0

Вы только глядя на выходные для окончательной даты после добавления дней, не смотря на выходные, как в начале, или (в случае 3) между ними дней. Почему не функция, как

function addDays(date, daysToAdd) { 
    for (let i=0; i<daystoAdd; i++) { 
     let nextDay = date.addDays(1); 
     if (nextDay.is().saturday()) { 
      nextDay = date.next().monday(); 
     } 
     date = nextDay; 
    } 
return date; 
} 

Тогда вам просто нужно вызвать эту функцию для каждого из пролетов:

$('.fromDate-1').html(addDays(Date.today(), 3)); 

Это проблема, которую пытались решить?

0

Я бы не использовал библиотеку дат для этого, это очень прямолинейно.

Кажется, товар только в рабочие дни, поэтому вам нужна функция, которая добавляет рабочие дни, а не ваш текущий алгоритм, что-то вроде ответов на exclude weekends in javascript date calculation.

Следующее делает что-то похожее только на добавление рабочих дней, оно действует только на небольшое количество дней (скажем от 0 до 10).

/* Add business days to a date. 
 
** @param {Date} date - date to start from 
 
** @param {number} deliveryDays - positive integer 
 
** @returns {Date} a new Date object for the delivery date 
 
*/ 
 
function getDeliveryDate(date, deliveryDays) { 
 
    // Default delivery is 3 days 
 
    deliveryDays = typeof deliveryDays == 'undefined'? 3 : deliveryDays; 
 
    // Copy date so don't modify original 
 
    var d = new Date(+date); 
 
    // Add days. If land on a Saturday or Sunday, move another day 
 
    while (deliveryDays--) { 
 
    d.setDate(d.getDate() + 1); 
 
    if (!(d.getDay() % 6)) ++deliveryDays; 
 
    } 
 
    return d; 
 
} 
 
    
 
// Some examples 
 
[ 
 
[new Date(2017,0,7),3], // Saturday start, 3 day delivery 
 
[new Date(2017,0,8),1], // Sunday start, 1 day delivery 
 
[new Date(2017,0,13),1], // Friday start, 1 day delivery 
 
[new Date(2017,0,13),3], // Friday start, 3 day delivery 
 
[new Date(2017,0,9), 3], // Monday start, 3 day delivery 
 
[new Date(2017,0,8), 7] // Sunday start, 7 day delivery 
 
].forEach(function(d) { 
 
    console.log('Ordered day : ' + d[0].toString() + 
 
       '\nDelivery days: ' + d[1] + 
 
       '\nDelivery on : ' + getDeliveryDate(d[0], d[1])); 
 
});

Смежные вопросы