@KimNeroda

Как починить java script код просчитывающий день доставки?

Есть код просчитывающий дату доставки товара на сайте. Алгоритм следующий:
Доставка по будним дням.
При заказе до 13.00 - доставка на следующий день.
При заказе после 13.00 — доставка через день.
В пятницу: при заказе до 13.00 - доставка в пн.
При заказе после 13.00 — доставка во вт.

В будни все отображается корректно, а с выходными проблемы.
Код следующий:

$(function(){
	// информация о доставке
	if($('.order_info_block').length) {

		// если цена заказа больше 3000, доставка бесплатная
		var item_price = $('.new-price .number').text();
		item_price = item_price.replace(' ', '');
		item_price = item_price.replace('.00', '');
		item_price = parseInt(item_price);
		console.log(item_price);
		var del_price = '350 руб.';
		if(item_price >= 3000) del_price = 'бесплатно';		

		// рассчитываем время доставки
		var del_time = 'завтра';

		var date = new Date();		
		var day = date.getDay();					
		var hours = date.getHours();
				
		// увеличенный срок доставки
		var next_date = new Date();		
		next_date.setDate(next_date.getDate()+2);
		
		// если четверг после 13, +2 дня (в понедельник)
		if(day == 4 && hours >= 13) {			
			next_date.setDate(next_date.getDate()+2);
		}

		// если пятница до 13, +1 день (в пн)
		if(day == 5 && hours <= 13) {			
			next_date.setDate(next_date.getDate()+1);
		}
				
		// если заказывают после 13 или в субботу, рассчитываем время доставки
		if(hours >= 13 || day == 6) {{			
			next_date.setDate(next_date.getDate()+2);
		}
					
			var month = next_date.getMonth();
			switch (month) {
				case 0:	month = 'января'; break;
				case 1:	month = 'февраля'; break;
				case 2:	month = 'марта'; break;
				case 3:	month = 'апреля'; break;
				case 4:	month = 'мая'; break;
				case 5:	month = 'июня'; break;
				case 6:	month = 'июля'; break;
				case 7:	month = 'августа'; break;
				case 8:	month = 'сентября'; break;
				case 9:	month = 'октября'; break;
				case 10: month = 'ноября'; break;
				case 11: month = 'декабря'; break;
			    default: month = '';
			}
			
			var weekday = next_date.getDay();
			switch (weekday) {
				case 0:	weekday = 'воскресенье'; break;
				case 1:	weekday = 'понедельник'; break;
				case 2:	weekday = 'вторник'; break;
				case 3:	weekday = 'среда'; break;
				case 4:	weekday = 'четверг'; break;
				case 5:	weekday = 'пятница'; break;
				case 6:	weekday = 'суббота'; break;
				default: weekday = 'не определено';
			}

			del_time = next_date.getDate() + " " + month + ", " + weekday;
		}


Где ошибка?
  • Вопрос задан
  • 324 просмотра
Пригласить эксперта
Ответы на вопрос 4
@vilgeforce
Раздолбай и программист
Ошибка в том, что вы не используете отладчик. Еще одна ошибка в том, что вы не показали с какими входными данными и как именно код работает неправильно и как он должен работать.
Ответ написан
IonDen
@IonDen
JavaScript developer. IonDen.com
Вообще, лучше используйте спец. библиотеки для работы со временем, а именно Moment.js. А то у вас почти весь код, это попытки сделать красиво, и совершенно не понятно где там косяк.

По этому, когда работаете с датами, в начале вычисляйте значения, а уж потом превращайте все это дело в красивые надписи на русском.
Ответ написан
Комментировать
@Aves
var next_date = new Date();
var day = next_date.getDay() || 7;
var hour = next_date.getHours();
var offset;
if (day < 4) {
    offset = hour < 13 ? 1 : 2;
} else if (day == 4) {
    offset = hour < 13 ? 1 : 4;
} else if (day == 5) {
    offset = hour < 13 ? 3 : 4;
} else {
    offset = 9 - day;
}
next_date.setDate(next_date.getDate() + offset);
Посмотреть можно здесь
Ответ написан
Комментировать
S-ed
@S-ed
Комбайнёр
// если четверг после 13, +2 дня (в понедельник)
    if(day == 4 && hours >= 13) {			
      next_date.setDate(next_date.getDate()+2); // суббота
    }

    // если пятница до 13, +1 день (в пн)
    if(day == 5 && hours <= 13) {			
      next_date.setDate(next_date.getDate()+1); // суббота
    }
        
    // если заказывают после 13 или в субботу, рассчитываем время доставки
    if(hours >= 13 || day == 6) {{			
      next_date.setDate(next_date.getDate()+2);
      //вернёт вт-пт для вс-ср и пн для сб
    }

Нет варианта для вс, правило для сб более сильное чем для чт. Да и в целом...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы