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

181

Итак, у меня есть две даты 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);

и затем вы можете использовать это значение в качестве разницы в миллисекундах (в обоих моих примерах diff имеет одинаковое значение)

Мартин
источник
1
Только образцы, использованные в примере, не так правильны. 4-значные годы обозначаются строчными yyyy, 2-значные месяцы прописными, MMа 2-значные дни строчными dd.
BalusC
1
Мартин, у меня сложилось впечатление, что здесь не использовались никакие шаблоны дат. MM DD, YYYY и NN EE, ZZZZ на самом деле являются «примерами значений», которые спросил Стивен. Другими словами, он не делает ничего для форматирования.
Вагнер Сильвейра
Я обновил второй пример, который, я думаю, все запутались. Я также добавил немного пояснений относительно того, как именно я интерпретирую значения, приведенные в его примере.
Мартин
Ваша вторая переменная должна быть вызвана t2.
Кис К. Баккер
В большинстве случаев вы, вероятно, будете выполнять 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и убедитесь, что они Даты.
Сет
@ Да, вы правы, поэтому я удалил свой комментарий ... одна из моих "дат" была на самом деле строкой. Это работает отлично.
user3344977
14

Если одна или обе ваши даты в будущем, то, боюсь, вы СОЛНЦЕ, если хотите с точностью до секунды. Время по Гринвичу имеет високосные секунды, о которых не известно около 6 месяцев, прежде чем они произойдут, поэтому любые даты, превышающие эту, могут быть неточными на некоторое количество секунд (и на практике, поскольку люди не обновляют свои машины так часто, вы может обнаружить, что любое время в будущем будет отключено на некоторое количество секунд).

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

rmeador
источник
7
+1 за упоминание о втором прыжке! Это так расстраивает, когда с этим неправильно обращаются даже люди, которые должны знать лучше (комитет POSIX, я смотрю на тебя ...)
Джим Льюис
1
Стоит отметить, что стандарт ECMA явно игнорирует високосные секунды (т. Е. Даже прошедшие високосные секунды): во временных значениях високосные секунды игнорируются. Предполагается, что есть ровно 86 400 000 миллисекунд в день .
Сильвен Леру
11

Вы можете сделать это просто.

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

источник
5

создайте два Dateобъекта и вызовите valueOf()оба, затем сравните их.

JavaScript Date Object Ссылка

Джейкоб Релкин
источник
2
getSeconds () -> Возвращает секунды. (Диапазон 0-59). Должно быть valueOf () или getTime ()
Стивен
4
var a = new Date("2010 jan 10"),
    b = new Date("2010 jan 9");

alert(
    a + "\n" + 
    b + "\n" +
    "Difference: " + ((+a - +b) / 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.Crossett
источник
@ Джефф, вы можете удалить этот ответ, чтобы не терять очки. Они попросили исходный код JavaScript, а не исходный код Visual Basic.
МакГайвер