Отримайте різницю між двома датами в секундах


149

Я намагаюся отримати різницю між двома датами в секундах. Логіка була б така:

  • встановити початкову дату, яка була б зараз;
  • встановіть кінцеву дату, яка була б початковою датою плюс деяка кількість секунд у майбутньому (скажімо, наприклад, 15)
  • отримати різницю між цими двома (кількість секунд)

Причина, чому я роблю це з датами, це тому, що кінцева дата / час залежить від деяких інших змінних, і це ніколи не буває однаковим (це залежить від того, наскільки швидко користувач щось робить), а також зберігаю початкову дату для інших речей.

Я намагався щось подібне:

var _initial = new Date(),
    _initial = _initial.setDate(_initial.getDate()),
    _final = new Date(_initial);
    _final = _final.setDate(_final.getDate() + 15 / 1000 * 60);

var dif = Math.round((_final - _initial) / (1000 * 60));

Вся справа в тому, що я ніколи не отримую правильної різниці. Я спробував розділити, за допомогою 24 * 60якого залишилося б на кілька секунд, але я ніколи не підходжу правильно. Отже, що не так у моїй логіці? Я можу зробити якусь дурну помилку, оскільки це вже досить пізно, але мене турбує, що я не можу змусити її працювати :)


2
Порядок операцій є ключовим.
Ділан Крос

1
Тому ви хочете мати позначку часу, додати 15 секунд, а потім побачити, яка різниця в секундах. Я б сказав, що шанси великі, що різниця буде .... дочекатися .... 15 секунд?
adeneo


1
Я дійсно розумію, що ви намагаєтесь зробити (я думаю), але якщо ви берете новий Date (), який зараз є Unix, додайте 15 секунд, і відразу перевірте різницю, різниця складе 15 секунд (мінус мілісекунди, які знадобилися для обчислення), але я здогадуюсь, ваш намір полягає в тому, щоб якось порівняти це в майбутньому.
adeneo

1
Я насправді не розумію цього, щоб довести свою думку, ось діючий ПІДТВОРЕННЯ для вашого вищевказаного прикладу. Якщо ви намагаєтеся з’ясувати, скільки часу користувачеві потрібно було щось зробити, ви зазвичай отримуєте часову позначку, коли користувач починає операцію, і часову позначку, коли користувач закінчив операцію, і порівнюйте їх, і ви знаєте, скільки часу зайняло . Чого чорт за 15 секунд?
аденео

Відповіді:


283

Код

var startDate = new Date();
// Do your operations
var endDate   = new Date();
var seconds = (endDate.getTime() - startDate.getTime()) / 1000;

Або навіть простіше, (endDate - startDate) / 1000як зазначено в коментарях, якщо ви не використовуєте машинопис.


Пояснення

Вам потрібно викликати getTime()метод для Dateоб'єктів, а потім просто відняти їх і розділити на 1000 (оскільки це спочатку в мілісекундах). Як додатковий виклик getDate()методу, ви фактично отримуєте день місяця як ціле число від 1 до 31 (не на основі нуля) на відміну від часу епохи, який ви отримаєте від виклику getTime()методу, що представляє кількість мілісекунд з 1 січня 1970 року, 00:00


Рант

Залежно від ваших операцій, пов’язаних з датою, ви можете вкласти гроші в інтеграцію бібліотеки, наприклад date.js або moment.js, що значно полегшує розробника, але це лише питання особистої переваги.

Наприклад, у moment.js ми б робили, moment1.diff(moment2, "seconds")що прекрасно.


Корисні документи для цієї відповіді


14
Там немає необхідності GetTime , терміни можуть бути відняті один від одного , як - оператор примушувати їх номери.
RobG

3
getTime необхідний, якщо ви використовуєте typecript, він не дозволяє арифметичним операціям між будь-яким іншим елементом, числом чи перерахуванням
zaffaste

Ви можете скористатися .valueOf(), як -би оператор закликав у будь-якому випадку ...
Єретична мавпа

1
як щодо того, якщо нам також потрібні різниці годин / хвилин ...? Чи слід було б розділити його на 60 чи кілька разів ...? @Juan
gumuruh

Будь ласка, додайте нові сумніви як окремі запитання, але оскільки це, мабуть, буде закрито як дублікат, подивіться тут stackoverflow.com/questions/1322732/…
Juan Cortés

5

Ви можете використовувати new Date().getTime()для отримання часових позначок. Тоді можна обчислити різницю між кінцевим і початковим і , нарешті , перетворити тимчасову мітку , яка msв s.

const start = new Date().getTime();
const end = new Date().getTime();

const diff = end - start;
const seconds = Math.floor(diff / 1000 % 60);

4
<script type="text/javascript">
var _initial = '2015-05-21T10:17:28.593Z';
var fromTime = new Date(_initial);
var toTime = new Date();

var differenceTravel = toTime.getTime() - fromTime.getTime();
var seconds = Math.floor((differenceTravel) / (1000));
document.write('+ seconds +');
</script>

1

Нижче код дасть різницю в часі в секунду.

var date1 = new Date(); // current date
var date2 = new Date("06/26/2018"); // mm/dd/yyyy format
var timeDiff = Math.abs(date2.getTime() - date1.getTime()); // in miliseconds
var timeDiffInSecond = Math.ceil(timeDiff / 1000); // in second

alert(timeDiffInSecond );

0

спробуйте використовувати виділені функції з мов програмування високого рівня. .getSeconds();Тут підходить JavaScript :

var specifiedTime = new Date("November 02, 2017 06:00:00");
var specifiedTimeSeconds = specifiedTime.getSeconds(); 

var currentTime = new Date();
var currentTimeSeconds = currentTime.getSeconds(); 

alert(specifiedTimeSeconds-currentTimeSeconds);

0

Різниця в часі між тепер і 10 хвилинами пізніше, використовуючи momentjs

let start_time = moment().format('YYYY-MM-DD HH:mm:ss');
let next_time = moment().add(10, 'm').format('YYYY-MM-DD HH:mm:ss');

let diff_milliseconds = Date.parse(next_time) - Date.parse(star_time);
let diff_seconds = diff_milliseconds * 1000;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.