Obtenga la diferencia horaria entre dos fechas en segundos

149

Estoy tratando de obtener una diferencia entre dos fechas en segundos. La lógica sería así:

  • establecer una fecha inicial que sería ahora;
  • establecer una fecha final que sería la fecha inicial más una cantidad de segundos en el futuro (digamos 15 por ejemplo)
  • obtener la diferencia entre esos dos (la cantidad de segundos)

La razón por la que lo hago con fechas es porque la fecha / hora final depende de algunas otras variables y nunca es la misma (depende de qué tan rápido un usuario haga algo) y también almaceno la fecha inicial para otras cosas.

He estado intentando algo como esto:

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));

El caso es que nunca obtengo la diferencia correcta. Traté de dividir entre 24 * 60lo que me dejaría con los segundos, pero nunca lo hago bien. Entonces, ¿qué tiene de malo mi lógica? Podría estar cometiendo un error estúpido ya que es bastante tarde, pero me molesta que no pueda hacerlo funcionar :)

Roland
fuente
2
El orden de las operaciones es clave.
Dylan Cross
1
Por lo tanto, le gustaría tener una marca de tiempo, agregar 15 segundos y luego ver cuál es la diferencia en segundos. Yo diría que las probabilidades son altas de que la diferencia será ... espera ... ¿15 segundos?
adeneo
Ver también: stackoverflow.com/questions/13893754
Tomasz Nurkiewicz
1
Realmente entiendo lo que estás tratando de hacer (creo), pero si tomas una nueva Fecha (), que es el tiempo de Unix en este momento, agrega 15 segundos y de inmediato verifica la diferencia, la diferencia será de 15 segundos (menos los milisegundos que tomó calcular), pero supongo que su intención es comparar esto en el futuro de alguna manera.
adeneo
1
Realmente no lo entiendo, para probar mi punto, aquí hay un FIDDLE que funciona para su ejemplo anterior. Si está tratando de averiguar cuánto tiempo tardó el usuario en hacer algo, generalmente obtiene la marca de tiempo cuando el usuario inicia la operación, y la marca de tiempo cuando el usuario terminó la operación, y las compara, y usted sabe cuánto tiempo tardó . ¿Para qué diablos son los 15 segundos?
adeneo

Respuestas:

283

El código

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

O incluso más simple (endDate - startDate) / 1000como se señala en los comentarios, a menos que esté usando el mecanografiado.


La explicación

Debe llamar al getTime()método para los Dateobjetos y luego simplemente restarlos y dividirlos por 1000 (ya que originalmente está en milisegundos). Como extra, cuando llama al getDate()método, de hecho obtiene el día del mes como un número entero entre 1 y 31 (no basado en cero) en lugar del tiempo de época que obtendría al llamar al getTime()método, representando el número de milisegundos desde el 1 de enero de 1970, 00:00


Despotricar

Dependiendo de cuáles sean sus operaciones relacionadas con la fecha, es posible que desee invertir en la integración de una biblioteca como date.js o moment.js que hace las cosas mucho más fáciles para el desarrollador, pero eso es solo una cuestión de preferencia personal.

Por ejemplo, en moment.js haríamos lo moment1.diff(moment2, "seconds")que es hermoso.


Documentos útiles para esta respuesta

Juan cortés
fuente
14
No hay ninguna necesidad de GetTime , las fechas pueden ser restadas una de otra como el - operador obligarlos a números.
RobG
3
getTime es necesario si utiliza el mecanografiado, no permite la operación aritmética entre elementos distintos de cualquier número o enumeración
zaffaste
Puede usar .valueOf(), que es lo que el -operador llamaría en cualquier caso ...
Heretic Monkey
1
¿qué tal si también necesitamos las diferencias de hora / minuto ...? ¿Debería dividirlo en 60 o múltiples ...? @Juan
gumuruh
Agregue nuevas dudas como preguntas individuales, pero dado que esta probablemente se cerraría como un duplicado, eche un vistazo aquí stackoverflow.com/questions/1322732/…
Juan Cortés
5

Puede usar new Date().getTime()para obtener marcas de tiempo. A continuación, se puede calcular la diferencia entre el inicio y final y, finalmente, transformar la marca de tiempo que está msen s.

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

const diff = end - start;
const seconds = Math.floor(diff / 1000 % 60);
Georgian-Sorin Maxim
fuente
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>
Abdulrahman A Alkhodairi
fuente
1

El siguiente código dará la diferencia horaria en segundo.

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 );
Gautam Rai
fuente
0

intente usar funciones dedicadas de lenguajes de programación de alto nivel. JavaScript se .getSeconds();adapta aquí:

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);
Gilbert Cut
fuente
0

diferencia horaria entre ahora y 10 minutos después usando 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;
Surya Singh
fuente