Склонение существительных в javascript-таймере

166
16 августа 2018, 06:20

От предыдущего владельца сайта мне достался следующий код, отсчитывающий время от определенной даты. Код работает, но при этом в нем отсутствуют склонения у дней и часов. https://codepen.io/anon/pen/bKZEMB

   window.onload=function() {
  // Month,Day,Year,Hour,Minute,Second
  upTime('feb,14,2018,14:00:00'); 
}
function upTime(countTo) {
  now = new Date();
  countTo = new Date(countTo);
  difference = (now-countTo);
  days=Math.floor(difference/(60*60*1000*24)*1);
  hours=Math.floor((difference%(60*60*1000*24))/(60*60*1000)*1);
  document.getElementById('days').firstChild.nodeValue = days;
  document.getElementById('hours').firstChild.nodeValue = hours;
  document.getElementById('minutes').firstChild.nodeValue = mins;
  document.getElementById('seconds').firstChild.nodeValue = secs;
  clearTimeout(upTime.to);
  upTime.to=setTimeout(function(){ upTime(countTo); },1000);
}

HTML

<div id="countup">
  Прошло
  <p id="days">00</p>
  <p class="timeRefDays">дней</p> и
  <p id="hours">00</p>
  <p class="timeRefHours">часов</p>
</div>

Сам я в javascript абсолютно ничего не понимаю, но этот момент очень сильно режет глаза. Буду благодарен за решение проблемы. Пытался самостоятельно адаптировать этот код https://gist.github.com/realmyst/1262561 но потерпел неудачу

Answer 1

Если не менять Ваш код, то пример "в лоб":

window.onload = function() { 
  // Month,Day,Year,Hour,Minute,Second 
  upTime('feb,14,2018,14:00:00'); 
} 
 
function upTime(countTo) { 
  now = new Date(); 
  countTo = new Date(countTo); 
  difference = (now - countTo); 
 
  days = Math.floor(difference / (60 * 60 * 1000 * 24) * 1); 
  hours = Math.floor((difference % (60 * 60 * 1000 * 24)) / (60 * 60 * 1000) * 1); 
 
  document.getElementById('days').firstChild.nodeValue = days; 
  document.getElementById('hours').firstChild.nodeValue = hours; 
 
  document.querySelector('.timeRefDays').textContent = 
    (days == 1 || (days > 19 && days % 10 == 1)) ? 'день' : 
    ((days > 1 && days < 5) || (days > 19 && days % 10 > 1 && days % 10 < 5)) ? 'дня' : 'дней'; 
 
  document.querySelector('.timeRefHours').textContent = 
    (hours == 1 || (hours > 19 && hours % 10 == 1)) ? 'час' : 
    ((hours > 1 && hours < 5) || (hours > 19 && hours % 10 > 1 && hours % 10 < 5)) ? 'часа' : 'часов'; 
 
  clearTimeout(upTime.to); 
  upTime.to = setTimeout(function() { 
    upTime(countTo); 
  }, 1000); 
}
<div id="countup"> 
  Прошло 
  <p id="days">00</p> 
  <p class="timeRefDays">дней</p> и 
  <p id="hours">00</p> 
  <p class="timeRefHours">часов</p> 
</div>

READ ALSO
Очистка полей ввода

Очистка полей ввода

помогите пожалуйста решить задачуНеобходимо очистить 3000 полей на одной странице

163
Отправить post запрос на rest api контроллер

Отправить post запрос на rest api контроллер

Нужно отправить POST запрос на rest-api контроллер и получить ответ с помощью скрипта в приложении asp web formsСкрипт :

185
Javascript помогите! [дубликат]

Javascript помогите! [дубликат]

На данный вопрос уже ответили:

126
Не получается загрузить скрипт c типом &ldquo;module&rdquo;

Не получается загрузить скрипт c типом “module”

В файле scriptjs есть фичи ЕS6 вроде import

164