Combien de secondes entre deux dates?

192

Donc j'ai deux dates YYYY-MM-DDetZZZZ-NN-EE

Comment puis-je savoir combien de secondes il y a entre eux?

Steven
la source
175
J'essaie de laisser au moins une demi-heure entre les dates pour ne pas me faire prendre.
Don Branson
yyyy-MM-ddest clair (année, mois, jour - notez qu'ils ne sont pas tous en majuscules), mais pas ZZZZ-NN-EE. Je l'interprète comme (fuseau horaire, ???, jour de la semaine). Est-ce une semaine en année? Si tel était le cas, cela aurait été ww. Mais alors, nous avons également besoin de l'année pour calculer la différence. Pouvez-vous s'il vous plaît donner quelques-unes des valeurs d'échantillon réelles?
BalusC
7
@BalusC: Je crois qu'il est simplement passé aux lettres suivantes pour désigner une deuxième date (Y -> Z, M -> N et D -> E). Utiliser des noms de variables tels que startDate et endDate aurait probablement été mieux.
Austin Salonen
Ah, je vois. Cela aurait en effet pu être demandé beaucoup plus clairement.
BalusC

Réponses:

255

Je prends YYYY et ZZZZ pour signifier des valeurs entières qui signifient l'année, MM et NN pour signifier des valeurs entières signifiant le mois de l'année et JJ et EE comme des valeurs entières signifiant le jour du mois.

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

Une source pratique pour référence future est le site MDN

Alternativement, si vos dates sont dans un format, javascript peut analyser

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

et ensuite vous pouvez utiliser cette valeur comme différence en millisecondes (dif dans mes deux exemples a la même signification)

Martin
la source
1
Seuls les modèles utilisés dans l'exemple ne sont pas corrects. Les années à 4 chiffres sont notées en minuscules yyyy, les mois à 2 chiffres en majuscules MMet les jours à 2 chiffres en minuscules dd.
BalusC
1
Martin, j'ai l'impression que nous n'utilisions aucun modèle de date ici. MM JJ, AAAA et NN EE, ZZZZ sont en fait les "valeurs d'exemple" demandées par Steven. Donc, en d'autres termes, il ne fait aucune sorte de formatage.
Wagner Silveira
J'ai mis à jour le deuxième exemple, ce qui, j'imagine, que tout le monde était confus. J'ai également ajouté un peu de clarification sur la manière exacte dont j'interprète les valeurs données dans son exemple.
Martin
Votre deuxième variable doit être appelée t2.
Kees C. Bakker
Dans la plupart des cas, vous ferez probablement t2 - t1, pas t1 - t2
UpTheCreek
85

Il suffit de soustraire:

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");
Seth
la source
@ user3344977 - alors quelque chose de drôle se passe! Vérifiez les valeurs de aet bet assurez-vous qu'il s'agit de dates.
Seth
@Seth vous avez raison donc j'ai supprimé mon commentaire .. une de mes "dates" était en fait une chaîne. Cela fonctionne parfaitement.
user3344977
14

Si l'une de vos dates ou les deux sont dans le futur, j'ai bien peur que vous soyez SOL si vous voulez une précision à la seconde. L'heure UTC a des secondes intercalaires qui ne sont connues que 6 mois environ avant qu'elles ne se produisent, donc toute date plus éloignée que cela peut être inexacte d'un certain nombre de secondes (et en pratique, puisque les gens ne mettent pas à jour leurs machines si souvent, peut trouver que n'importe quel moment dans le futur est décalé d'un certain nombre de secondes).

Cela donne une bonne explication de la théorie de la conception des bibliothèques de date / heure et pourquoi il en est ainsi: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs

rmeador
la source
7
+1 pour avoir mentionné le deuxième problème! C'est tellement frustrant quand cela est mal géré, même par des gens qui devraient mieux savoir (comité POSIX, je vous regarde ...)
Jim Lewis
1
Il convient de mentionner que la norme ECMA ignore explicitement les secondes intercalaires (c'est-à-dire même après les secondes intercalaires): dans les valeurs de temps, les secondes intercalaires sont ignorées. On suppose qu'il y a exactement 86 400 000 millisecondes par jour .
Sylvain Leroux
12

Vous pouvez le faire simplement.

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

la source
5

créez deux Dateobjets et faites appel valueOf()aux deux, puis comparez-les.

Référence d'objet de date JavaScript

Jacob Relkin
la source
2
getSeconds () -> Renvoie les secondes. (La plage est comprise entre 0 et 59). Devrait être valueOf () ou getTime ()
Steven
4
var a = new Date("2010 jan 10"),
    b = new Date("2010 jan 9");

alert(
    a + "\n" + 
    b + "\n" +
    "Difference: " + ((+a - +b) / 1000)
);
Justin Johnson
la source
2

Moyen facile:

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));
Tarte Fernando
la source
-3

Dans bash:

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

Il nécessite l'installation de bc et gnu date.

Alex G
la source
1
En quoi est-ce pertinent?
Dropout
-10

.Net fournit la classe TimeSpan pour faire le calcul à votre place.

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
la source
@Jeff, vous souhaiterez peut-être supprimer cette réponse pour ne pas perdre de points. Ils ont demandé du code source JavaScript, plutôt que du code source Visual Basic.
MacGyver