Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.07.2022, 20:16
Профессор
Отправить личное сообщение для NovichokJS Посмотреть профиль Найти все сообщения от NovichokJS
 
Регистрация: 25.04.2022
Сообщений: 159

Получить разницу двух дат
Мне нужно получить разницу в таком формате:
9d 21h 103m 80s


Написал код:

const getDiff = (startDate, endDate) => {
  let date1 = new Date(startDate);
  let date2 = new Date(endDate);

  let days = Math.round(Math.abs((date1 - date2) / (1000 * 60 * 60 * 24)));
  let hours = Math.round(Math.abs((date1 - date2) / (1000 * 60 * 60)));
  let minutes = Math.round(Math.abs((date1 - date2) / (1000 * 60)));
  let seconds = Math.round(Math.abs((date1 - date2) / 1000));

  return `${days}d ${hours}h ${minutes}m ${seconds}s`;
};
console.log(getDiff(new Date(2022, 11, 18, 3, 25, 0), new Date(2022, 11, 9, 1, 2, 0)));
console.log(getDiff(new Date(2022, 11, 9, 1, 2, 0), new Date(2022, 11, 18, 3, 25, 0)));


Получается что некорректно..
Ответить с цитированием
  #2 (permalink)  
Старый 11.07.2022, 20:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

NovichokJS,

const getDiff = (startDate, endDate) => {
  let date1 = new Date(startDate);
  let date2 = new Date(endDate);
  let difference = Math.abs(date1 - date2);
  let days = Math.round(difference / (1000 * 60 * 60 * 24));
  difference -= days * (1000 * 60 * 60 * 24)
  let hours = Math.round(difference / (1000 * 60 * 60));
  difference -= hours * (1000 * 60 * 60)
  let minutes = Math.round(difference /  (1000 * 60));
  difference -= minutes * (1000 * 60)
  let seconds = difference;

  return `${days}d ${hours}h ${minutes}m ${seconds}s`;
};
console.log(getDiff(new Date(2022, 11, 18, 3, 25, 0), new Date(2022, 11, 9, 1, 2, 0)));
console.log(getDiff(new Date(2022, 11, 9, 1, 2, 0), new Date(2022, 11, 18, 3, 25, 0)));
Ответить с цитированием
  #3 (permalink)  
Старый 11.07.2022, 21:00
Профессор
Отправить личное сообщение для NovichokJS Посмотреть профиль Найти все сообщения от NovichokJS
 
Регистрация: 25.04.2022
Сообщений: 159

Сообщение от рони Посмотреть сообщение
NovichokJS,

const getDiff = (startDate, endDate) => {
  let date1 = new Date(startDate);
  let date2 = new Date(endDate);
  let difference = Math.abs(date1 - date2);
  let days = Math.round(difference / (1000 * 60 * 60 * 24));
  difference -= days * (1000 * 60 * 60 * 24)
  let hours = Math.round(difference / (1000 * 60 * 60));
  difference -= hours * (1000 * 60 * 60)
  let minutes = Math.round(difference /  (1000 * 60));
  difference -= minutes * (1000 * 60)
  let seconds = difference;

  return `${days}d ${hours}h ${minutes}m ${seconds}s`;
};
console.log(getDiff(new Date(2022, 11, 18, 3, 25, 0), new Date(2022, 11, 9, 1, 2, 0)));
console.log(getDiff(new Date(2022, 11, 9, 1, 2, 0), new Date(2022, 11, 18, 3, 25, 0)));
Тесты возвращают результат:
  • Функция getDiff должна вернуть разницу двух дат
  • Функция getDiff должна вернуть разницу двух дат, когда первая меньше второй

что-то не то((
Ответить с цитированием
  #4 (permalink)  
Старый 11.07.2022, 21:06
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

NovichokJS,
что не так?
Ответить с цитированием
  #5 (permalink)  
Старый 11.07.2022, 21:21
Профессор
Отправить личное сообщение для NovichokJS Посмотреть профиль Найти все сообщения от NovichokJS
 
Регистрация: 25.04.2022
Сообщений: 159

Сообщение от рони Посмотреть сообщение
NovichokJS,
что не так?
let seconds = difference;

разве не надо тут делить на 1000 ?
Ответить с цитированием
  #6 (permalink)  
Старый 11.07.2022, 21:35
Профессор
Отправить личное сообщение для NovichokJS Посмотреть профиль Найти все сообщения от NovichokJS
 
Регистрация: 25.04.2022
Сообщений: 159

а нельзя решить с помощью методов getHours() и т.п? вместо того чтобы употреблять вот это hours * (1000 * 60 * 60) ?
Ответить с цитированием
  #7 (permalink)  
Старый 11.07.2022, 21:42
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Сообщение от NovichokJS
разве не надо тут делить на 1000 ?
ок.
const getDiff = (startDate, endDate) => {
  let date1 = new Date(startDate);
  let date2 = new Date(endDate);
  let difference = Math.abs(date1 - date2);
  let days = Math.trunc(difference / (1000 * 60 * 60 * 24));
  difference -= days * (1000 * 60 * 60 * 24)
  let hours = Math.trunc(difference / (1000 * 60 * 60));
  difference -= hours * (1000 * 60 * 60)
  let minutes = Math.trunc(difference /  (1000 * 60));
  difference -= minutes * (1000 * 60)
  let seconds = difference/1000;

  return `${days}d ${hours}h ${minutes}m ${seconds}s`;
};
console.log(getDiff(new Date(2022, 11, 18, 3, 25, 0), new Date(2022, 11, 9, 1, 2, 0)));
console.log(getDiff(new Date(2022, 11, 9, 1, 2, 0), new Date(2022, 11, 18, 3, 25, 0)));
Ответить с цитированием
  #8 (permalink)  
Старый 11.07.2022, 21:53
Профессор
Отправить личное сообщение для NovichokJS Посмотреть профиль Найти все сообщения от NovichokJS
 
Регистрация: 25.04.2022
Сообщений: 159

хух, проблема была в том что тут let seconds = difference/1000; был пропущен Math.trunc
Ответить с цитированием
  #9 (permalink)  
Старый 11.07.2022, 21:53
Профессор
Отправить личное сообщение для NovichokJS Посмотреть профиль Найти все сообщения от NovichokJS
 
Регистрация: 25.04.2022
Сообщений: 159

Рони, спасибо!
Ответить с цитированием
  #10 (permalink)  
Старый 13.07.2022, 12:39
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Альтертанивный вариант (извиняюсь что без новомодных let и =>)
function getDiff(startDate, endDate) {
//  var date1 = new Date(startDate);
//  var date2 = new Date(endDate);
//  var diff = Math.abs(date2-date1);
  var diff = Math.abs(new Date(endDate) - new Date(startDate));

  diff = (diff-(diff%1000))/1000;
  var seconds = diff % 60;
  diff = (diff-seconds)/60;
  var minutes = diff % 60;
  diff = (diff-minutes)/60;
  var hours = diff % 24;
  var days = (diff-hours)/24;
  return days+"d "+hours+"h "+minutes+"m "+seconds+"s";
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить город пользователя из двух Elect Библиотеки/Тулкиты/Фреймворки 1 25.02.2016 21:55
Объясните разницу в работе в двух примерах с append (с html() и без) spo jQuery 4 23.11.2015 19:58
из двух массивов jquery получить доступ к элементам и создать третий? ninja2 Общие вопросы Javascript 18 19.06.2015 15:12
Сравнение двух дат fAmOus Элементы интерфейса 1 21.08.2012 16:27
MySQl дата между двух дат mycoding Серверные языки и технологии 8 14.02.2011 15:23