Под постом в ленте VK пишут «только что», «7 мин назад», «3 ч назад». Подпись должна обновляться сама, но ставить setInterval на каждую секунду для 200 постов в ленте — лишняя работа: «3 ч назад» не меняется ещё час.
Напишите timeAgo(ts). ts — время поста в мс, текущее время — Date.now(). Пусть d = now − ts; если d < 0 (часы сервера спешат), считайте d = 0.
Текст: d меньше минуты — только что; меньше часа — N мин назад; меньше суток — N ч назад; меньше 7 суток — N дн. назад; дальше — N нед. назад. N — целая часть, округление вниз.
Верните { text, nextIn }, где nextIn — через сколько мс текст изменится: до следующей целой минуты, часа, суток или недели. Компонент ставит один setTimeout(rerender, nextIn) вместо интервала.
В работе: В ленте 200 постов: интервал раз в секунду — 200 перерисовок в секунду, а по nextIn — несколько в минуту на всю ленту.
Пример 1: только что
1000000, 12000, "once", 0
{"text": "только что", "nextIn": 48000}Пример 2: пять минут
1000000, 330000, "once", 0
{"text": "5 мин назад", "nextIn": 30000}timeAgo — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 9: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function timeAgo(ts) // → { text: string, nextIn: number }
Источник: на задачах VK: лента новостей и комментарии. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.