fapchat
@fapchat

Как работает этот код?

function formatDate(date) {
  let diff = new Date() - date; //Тут вроде-бы понятьно

  if (diff < 1000) { // тут тоже
    return 'right now';
  }

  let sec = Math.floor(diff / 1000); // и тут

  if (sec < 60) {
    return sec + ' sec. ago';
  }

  let min = Math.floor(diff / 60000); //даже тут
  if (min < 60) {
    return min + ' min. ago';
  }

  
  
  
  let d = date;  
  d = [  // тут она уже не пустая, я так понял: она изменяет date, но объясните всё по-подробнее 
    '0' + d.getDate(), //зачем этот ноль?
    '0' + (d.getMonth() + 1),
    '' + d.getFullYear(),
    '0' + d.getHours(),
    '0' + d.getMinutes()
  ].map(component => component.slice(-2)); // 'take last 2 digits of every component' и зачем?

  // join the components into date. Типо 3 первых и 3 последних элемента массива d. Зачем?
  return d.slice(0, 3).join('.') + ' ' + d.slice(3).join(':');
}

alert( formatDate(new Date(new Date - 1)) ); // "right now" (new Date(new Date - 1) почему не просто new //Date - 1? Автор учебника не показывал примеры, чтобы в new Date помещался другой new Date)

alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30 sec. ago"

alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5 min. ago"

// yesterday's date like 31.12.2016, 20:00
alert( formatDate(new Date(new Date - 86400 * 1000)) );
  • Вопрос задан
  • 132 просмотра
Решения вопроса 1
Stalker_RED
@Stalker_RED
//зачем этот ноль?
Чтобы получить не 3 минуты а 03 кто-то "умный" придумал добавить ноль в начале, а потом взять последние два символа.
Можно бы заменить на x<10 ? '0' + x : x

// Типо 3 первых и 3 последних элемента массива d. Зачем?
ну типа год.мес.день чч:мм:сс

Но лучше выбрось эту фигню, и научись использовать Intl.DateTimeFormat
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
rockon404
@rockon404
Frontend Developer
Учимся простому дебагингу. Выводим в консоль интересующие места:
function formatDate(date) {
  /* код без изменений */  
 
  let d = date;

  const dWithoutZeros = [
    d.getDate(),
    (d.getMonth() + 1),
    d.getFullYear(),
    d.getHours(),
    d.getMinutes()
  ];

  console.log('d[]: ', dWithoutZeros);

  d = [
    '0' + d.getDate(),
    '0' + (d.getMonth() + 1),
    '' + d.getFullYear(),
    '0' + d.getHours(),
    '0' + d.getMinutes()
  ];
  
  console.log('d[] with zeros: ', d);
  
  d = d.map(component => component.slice(-2));
  
  console.log('d[] sliced: ', d);
  
  const a = d.slice(0, 3).join('.');
  
  console.log('part a: ', a);
  
  const b = d.slice(3).join(':');
  
  console.log('part b: ', b);
  
  const result = a + ' ' + b;
  
  console.log('result: ', result);
  
  return result;
}

/* код без изменений */

Запускаем и смотрим вывод. Все вопросы, кроме одного, отпадают.

почему не просто new Date - 1? Автор учебника не показывал примеры, чтобы в new Date помещался другой new Date

Открываем jsfiddle. Набираем:
console.log('case 1: ', new Date - 1);
console.log('case 2: ', new Date(new Date - 1));

Запускаем и смотрим вывод. Делаем выводы. На всякий случай читаем MDN.

Поздравляю, вы научились дебагингу с помощью консоли, а так же узнали о существовании MDN и если у вас когда-либо возникнут подобные вопросы, вы теперь знаете как самостоятельно получить на них ответ.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы