Скільки секунд між двома датами?


180

Тож у мене дві дати YYYY-MM-DDіZZZZ-NN-EE

Як я можу дізнатися, скільки секунд між ними?


173
Я намагаюся залишити принаймні півгодини між побаченнями, щоб не попастися.
Дон Бренсон

yyyy-MM-ddзрозуміло (рік, місяць, день, - зауважте, що вони не всі великі), але ZZZZ-NN-EE не так. Я трактую це як (часовий пояс, ???, день у тиждень). Це тиждень у році? Якби так, це було б ww. Але тоді нам також потрібен рік, щоб підрахувати різницю. Чи можете ви, будь ласка, надати деякі фактичні значення вибірки
BalusC

7
@BalusC: Я вважаю, що він просто перейшов до наступних літер, щоб позначити другу дату (Y -> Z, M -> N і D -> E). Використання імен змінних, таких як startDate та endDate, можливо, було б краще.
Остін Салонен

А, бачу. Це справді можна було б запитати набагато чіткіше.
BalusC

Відповіді:


242

Я беру YYYY & ZZZZ до цілих цілих значень, які означають рік, MM & NN - цілих цілих значень, що означають місяць року, а DD & EE - цілі числа, що означають день місяця.

var t1 = new Date(YYYY, MM, DD, 0, 0, 0, 0);
var t2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0);
var dif = t1.getTime() - t2.getTime();

var Seconds_from_T1_to_T2 = dif / 1000;
var Seconds_Between_Dates = Math.abs(Seconds_from_T1_to_T2);

Зручним джерелом для подальшого ознайомлення є сайт MDN

Крім того, якщо ваші дати надходять у форматі, JavaScript може проаналізувати

var dif = Date.parse(MM + " " + DD + ", " + YYYY) - Date.parse(NN + " " + EE + ", " + ZZZZ);

і тоді ви можете використовувати це значення як різницю в мілісекундах (dif в обох моїх прикладах має однакове значення)


1
Тільки візерунки, використані в прикладі, не так. 4-значні роки відзначаються малими літерами yyyy, двозначними місяцями великими літерами MMта двозначними днями малими літерами dd.
BalusC

1
Мартіне, у мене таке враження, що тут не використовували жодних зразків дат. MM DD, YYYY та NN EE, ZZZZ - це фактично "приклади значень", про які запитував Стівен. Іншими словами, він не робить жодного виду для форматування.
Вагнер Сільвейра

Я оновив другий приклад, і це, напевне, всі заплуталися. Я також додав трохи уточнень щодо того, як саме я інтерпретую значення, наведені в його прикладі.
Мартін

Вашу другу змінну потрібно викликати t2.
Kees C. Bakker

У більшості випадків, ймовірно, ви будете робити t2 - t1, а не t1 - t2
UpTheCreek

83

Просто відніміть:

var a = new Date();
alert("Wait a few seconds, then click OK");

var b = new Date();
var difference = (b - a) / 1000;

alert("You waited: " + difference + " seconds");

@ user3344977 - тоді щось смішне відбувається! Перевірте значення aі bта переконайтеся , що вони Дата.
Сет

@Seth ви маєте рацію, тому я видалив свій коментар. Один з моїх «побачень» насправді був рядком. Це прекрасно працює.
користувач3344977

14

Якщо одна чи обидві дати у вас в майбутньому, я боюсь, що ви SOL, якщо хочете отримати другу точність. Час UTC має секунди стрибків, які не відомі приблизно 6 місяців до того, як вони відбудуться, тому будь-які дати, ніж ті, можуть бути неточними на деяку кількість секунд (і на практиці, оскільки люди не оновлюють свої машини так часто, ви може виявити, що будь-який час у майбутньому вимкнеться на деяку кількість секунд).

Це дає хороше пояснення теорії створення бібліотек дати / часу і чому це так: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs


7
+1 за згадку про випускний другий випуск! Це так засмучує, коли з цим трапляються неправильно, навіть люди, які повинні знати краще (комітет POSIX, я дивлюся на тебе ...)
Джим Льюїс

1
Варто згадати, що стандарт ECMA явно ігнорує високосні секунди (тобто: навіть минулі високосні секунди): У часові значення високосні секунди ігноруються. Передбачається, що в день відбувається рівно 86 400 000 мілісекунд .
Сільвейн Леру

11

Зробити це можна просто.

var secondBetweenTwoDate = Math.abs((new Date().getTime() - oldDate.getTime()) / 1000);



0

Легкий шлях:

function diff_hours(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60 * 60);
  return Math.abs(Math.round(diff));

 }


function diff_minutes(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60);
  return Math.abs(Math.round(diff));

 }

function diff_seconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  return Math.abs(Math.round(diff));

 }

function diff_miliseconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime());
  return Math.abs(Math.round(diff));

 }


dt1 = new Date(2014,10,2);
dt2 = new Date(2014,10,3);
console.log(diff_hours(dt1, dt2));


dt1 = new Date("October 13, 2014 08:11:00");
dt2 = new Date("October 14, 2014 11:13:00");
console.log(diff_hours(dt1, dt2));

console.log(diff_minutes(dt1, dt2));

console.log(diff_seconds(dt1, dt2));

console.log(diff_miliseconds(dt1, dt2));

-3

У басі:

bc <<< "$(date --date='1 week ago' +%s) - \
    $(date --date='Sun,  29 Feb 2004 16:21:42 -0800' +%s)"

Для цього потрібно встановити дату bc та gnu.


1
Наскільки це актуально?
Випадання

-10

.Net забезпечує клас TimeSpan, щоб зробити математику за вас.

var time1 = new Date(YYYY, MM, DD, 0, 0, 0, 0)
var time2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0)

Dim ts As TimeSpan = time2.Subtract(time1)

ts.TotalSeconds

@Jeff, ви можете видалити цю відповідь, щоб не втрачати бали. Вони запитували вихідний код JavaScript, а не Visual Basic.
MacGyver
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.