Date Javascript comparaison

  • Hari Narayanan
  • Graduate
  • Graduate
  • No Avatar
  • Inscription: Juin 07, 2005
  • Messages: 103
  • Status: Offline

Message Juin 22nd, 2005, 1:37 am

Salut à tous

Comment comparer 2 dates en utilisant Javascript?

[Tout comme la façon dont nous le faire en utilisant VBScript DateDiff () la fonction, mais les navigateurs non-IE ne sera pas analyser VBScript! ].
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Juin 22nd, 2005, 1:37 am

  • Dark Uncle
  • Beginner
  • Beginner
  • No Avatar
  • Inscription: Juin 21, 2005
  • Messages: 46
  • Status: Offline

Message Juin 22nd, 2005, 2:07 am

Code: [ Select ]
<script language="JavaScript">

var days = 0;
var difference = 0;

Christmas = new Date("December 25, 2005");

today = new Date();

difference = Christmas - today;

days = Math.round(difference/(1000*60*60*24));

</script>
  1. <script language="JavaScript">
  2. var days = 0;
  3. var difference = 0;
  4. Christmas = new Date("December 25, 2005");
  5. today = new Date();
  6. difference = Christmas - today;
  7. days = Math.round(difference/(1000*60*60*24));
  8. </script>


Tiré de http://codepunk.hardwar.org.uk/ajs07.htm
  • Hari Narayanan
  • Graduate
  • Graduate
  • No Avatar
  • Inscription: Juin 07, 2005
  • Messages: 103
  • Status: Offline

Message Juin 22nd, 2005, 2:07 am

Got it!
Heres le code.....

Code: [ Select ]
<html>
<head>
<title>Compare Dates</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<Script Language=Javascript>
function CompareDates()
{
    var str1 = document.getElementById("Fromdate").value;
    var str2 = document.getElementById("Todate").value;
    var dt1  = parseInt(str1.substring(0,2),10);
    var mon1 = parseInt(str1.substring(3,5),10);
    var yr1  = parseInt(str1.substring(6,10),10);
    var dt2  = parseInt(str2.substring(0,2),10);
    var mon2 = parseInt(str2.substring(3,5),10);
    var yr2  = parseInt(str2.substring(6,10),10);
    var date1 = new Date(yr1, mon1, dt1);
    var date2 = new Date(yr2, mon2, dt2);

    if(date2 < date1)
    {
        alert("To date cannot be greater than from date");
        return false;
    }
    else
    {
        alert("Submitting ...");
        document.form1.submit();
    }
}

</Script>
</head>

<body bgcolor="#FFFFFF" text="#000000">
<form name="form1" method="post" action="">
<input type="text" name="fromdate" id="fromdate" value="20/10/2005">
<input type="text" name="todate" id="todate" value="19/10/2005">
<input type="button" value="compare dates" onclick="CompareDates()">
</form>
</body>
</html>
  1. <html>
  2. <head>
  3. <title>Compare Dates</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  5. <Script Language=Javascript>
  6. function CompareDates()
  7. {
  8.     var str1 = document.getElementById("Fromdate").value;
  9.     var str2 = document.getElementById("Todate").value;
  10.     var dt1  = parseInt(str1.substring(0,2),10);
  11.     var mon1 = parseInt(str1.substring(3,5),10);
  12.     var yr1  = parseInt(str1.substring(6,10),10);
  13.     var dt2  = parseInt(str2.substring(0,2),10);
  14.     var mon2 = parseInt(str2.substring(3,5),10);
  15.     var yr2  = parseInt(str2.substring(6,10),10);
  16.     var date1 = new Date(yr1, mon1, dt1);
  17.     var date2 = new Date(yr2, mon2, dt2);
  18.     if(date2 < date1)
  19.     {
  20.         alert("To date cannot be greater than from date");
  21.         return false;
  22.     }
  23.     else
  24.     {
  25.         alert("Submitting ...");
  26.         document.form1.submit();
  27.     }
  28. }
  29. </Script>
  30. </head>
  31. <body bgcolor="#FFFFFF" text="#000000">
  32. <form name="form1" method="post" action="">
  33. <input type="text" name="fromdate" id="fromdate" value="20/10/2005">
  34. <input type="text" name="todate" id="todate" value="19/10/2005">
  35. <input type="button" value="compare dates" onclick="CompareDates()">
  36. </form>
  37. </body>
  38. </html>
  • katana
  • Mastermind
  • Mastermind
  • Avatar de l’utilisateur
  • Inscription: Sep 07, 2004
  • Messages: 2390
  • Loc: Edinburgh, Scotland
  • Status: Offline

Message Juin 22nd, 2005, 2:16 am

Javascript a l'objet Date, donc si vous avez besoin pour créer les deux dates à comparer, à savoir:
Code: [ Select ]
var d1 = new Date(2005, 5, 1); // creates a new Date for the 1st June 2005
var d2 = new Date(); // creates a new Date representing today
  1. var d1 = new Date(2005, 5, 1); // creates a new Date for the 1st June 2005
  2. var d2 = new Date(); // creates a new Date representing today


Pour calculer la différence, de convertir à la fois à leurs représentations milliseconde et soustraire:

Code: [ Select ]
var milli_d1 = d1.getTime();
var milli_d2 = d2.getTime();
var diff = milli_d1 - milli_d2;
  1. var milli_d1 = d1.getTime();
  2. var milli_d2 = d2.getTime();
  3. var diff = milli_d1 - milli_d2;

Dans ce cas la différence est négative, comme D1 précède d2.
Pour calculer le nombre de jours entre deux dates:
Code: [ Select ]
var num_days = (((diff / 1000) / 60) / 60) / 24;


Pas aussi facile que VBScript rend gif "alt =";)" title =" Wink "/>
Why do geeks get Halloween and Christmas confused?
Because 31 Oct == 25 Dec
www.darren-king.co.uk
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Juin 22nd, 2005, 2:27 am

Code: [ Select ]
1000*60*60*24

Tip a écrit:
Quand les mathématiques traitant avec des constantes est découvert, en remplacement de l'équation avec son résultat, dans ce cas 86400000, exige des systèmes exécutant l'application à faire moins de travail.
Strong with this one, the sudo is.
  • George_Gambino
  • Student
  • Student
  • No Avatar
  • Inscription: Oct 02, 2004
  • Messages: 89
  • Status: Offline

Message Août 23rd, 2008, 11:52 pm

Comparaison de deux dates en Javascript est tous sur l'utilisation de la Date () l'objet, comme l'a fait allusion aussi à un couple de postes déjà. Heres un bon article sur la manière de vérifier si une date entrée par l'intermédiaire d'un champ de formulaire est antérieure à la date d'aujourd'hui:

http://www.ImageCowboy.com/articles/javascript_date_function_compare_two_dates.asp

Gambino
  • tjcrowder
  • Newbie
  • Newbie
  • No Avatar
  • Inscription: Fév 27, 2010
  • Messages: 5
  • Status: Offline

Message Février 27th, 2010, 10:35 am

Pour le bénéfice de qui que ce soit tomber sur ce fil, la plupart des répondants ci-dessus sont à travailler trop dur. :D

Si vous voulez savoir si une instance date est antérieure à l'autre, utilisez simplement le < opérateur, qui est définie comme la comparaison des valeurs primitives d'objets. La valeur primitive d'un objet Date est son millisecondes depuis-La valeur Epoch (aka Date #getTime ), Voir les articles 9.1 et 15.9 de la spécification ECMA 3e édition. Par conséquent < , == , Et > travailler comme vous peut s'y attendre, pas besoin d'appeler explicitement getTime () .

Calculs arithmétiques sont fait la même manière. Soustraire une date d'une autre date et le résultat est la différence en millisecondes. (L'addition est un peu étrange, puisque ce que vous ajoutez sont leurs valeurs époque, si le résultat ne va pas beaucoup de sens.)
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Février 27th, 2010, 11:47 am

Ici, je pense comparaison des deux dates via: <=> invoquera la méthode toString de l'objet Date et finissent par comparer les chaînes renvoyées. Im savez toujours pas si thats whats passe réellement. :scratchhead: Il vous serait bien si je savais quelle partie de dire, Firefox ou Chrome code source je devrais regarder pour le savoir.
Strong with this one, the sudo is.
  • tjcrowder
  • Newbie
  • Newbie
  • No Avatar
  • Inscription: Fév 27, 2010
  • Messages: 5
  • Status: Offline

Message Février 28th, 2010, 1:33 am

@ joebert:
Quote:
Ici, je pense comparaison des deux dates via: <=> invoquera la méthode toString de l'objet Date et finissent par comparer les chaînes renvoyées.

Nope, les compare via valueOf, qui pour date est la même que getTime.
Quote:
Il vous serait bien si je savais quelle partie de dire, Firefox ou Chrome code source je devrais regarder pour le savoir.

Pas besoin de tri dans le code source, la spécification (ECMA-International. normes org / publications / / ECMA-262.htm) est clair, il vous suffit de sections de référence. Commencez avec 11.8.5 ( "The Abstract Relationnel Comparaison Algorithm") qui nous indique les valeurs seront comparées en utilisant le [[ToPrimitive]] en coopération avec le "conseil" Number. Dirigez-vous vers la section 9.1 ( "ToPrimitive") et il nous dit que pour les objets, [[ToPrimitive]], passe juste par le biais de [[DefaultValue]], en passant sur l'indice. Dirigez-vous vers 8.12. 8 ( "DefaultValue (indice)") et il nous indique si l'indicateur est en nombre et l'objet a un valueOf, valueOf utilisation itll. So check out Dates valueOf (15.9.5.8) et qu'elle dit qu'elle renvoie "cette valeur temps» qui est le moyen le specs de dire le nombre de millisecondes depuis l'époque (lire l'introduction pour l'objet Date [15.9.1, 15.9.1.1 ] pour vérifier cela). Idéalement, la section très prochaine (15.9.5.9) est getTime, qui dit la même chose.

(Ces chiffres proviennent de la section nouvelle spécification 5e édition, mais l'ECMA ont été très intelligent et d'éviter les changements de numéros section où ils le pouvaient. Dans les spécifications du 3e édition, la seule différente est que «[[DefaultValue]] (indice)" est 8.6.2.6 au lieu de 8.12.8.)

Il est aussi trivial de le prouver expérimentalement:
Code: [ Select ]
var d1, d2;

d1 = new Date(2010, 10, 1);
d2 = new Date(2009, 10, 3);

write("d1: " + d1);
// Writes "Mon Nov 01 2010 00:00:00 GMT+0000 (GMT Standard Time)"
write("d2: " + d2);
// Writes "Tue Nov 03 2009 00:00:00 GMT+0000 (GMT Standard Time)"

write(d1 > d2);
// writes "true", d1 is in 2010, d2 is in 2009
write(d1.toString() > d2.toString());
// writes "false", d1's string starts with an "M", d2's with a "T"; "M" < "T"
  1. var d1, d2;
  2. d1 = new Date(2010, 10, 1);
  3. d2 = new Date(2009, 10, 3);
  4. write("d1: " + d1);
  5. // Writes "Mon Nov 01 2010 00:00:00 GMT+0000 (GMT Standard Time)"
  6. write("d2: " + d2);
  7. // Writes "Tue Nov 03 2009 00:00:00 GMT+0000 (GMT Standard Time)"
  8. write(d1 > d2);
  9. // writes "true", d1 is in 2010, d2 is in 2009
  10. write(d1.toString() > d2.toString());
  11. // writes "false", d1's string starts with an "M", d2's with a "T"; "M" < "T"

Comme vous pouvez le voir, ne pas utiliser ses toString lorsque l'on compare sur le plan relationnel instances Date.

(Ci-dessus, «écrire» est tout mécanisme de sortie que vous souhaitez utiliser: il doit être sûr de traiter ce qu'elle reçoit comme une chaîne, ou elle mai de sortie -1 au lieu du vrai et du 0 au lieu de faux - qui revient au même chose, mais son moins clair.)
--
TJ Crowder
Consultant indépendant de logiciels
tj / logiciel Crowder com /
www crowdersoftware com
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Février 28th, 2010, 1:11 pm

Id tiens à dire non conformes et mise en œuvre sont parfois des choses différentes, mais son dur d'argumenter avec ce poste. Explaination Nice, TJ :D
Strong with this one, the sudo is.
  • tjcrowder
  • Newbie
  • Newbie
  • No Avatar
  • Inscription: Fév 27, 2010
  • Messages: 5
  • Status: Offline

Message Février 28th, 2010, 1:40 pm

@ joebert:
Quote:
Explaination Nice, TJ

Merci!
Quote:
Id tiens à dire non conformes et la mise en œuvre sont parfois des choses différentes...

Ouais. :D Thats où l'expérience entre en jeu. J'aime en général de savoir ce que sa supposée faire, alors il faut vérifier qu'il ne vraiment.

- TJ
  • Psyborg
  • Born
  • Born
  • No Avatar
  • Inscription: Sep 24, 2010
  • Messages: 1
  • Status: Offline

Message Septembre 24th, 2010, 8:58 am

Ok, Merci pour toutes les observations ci-dessus, theyre tous très bien pensés et utiles.

J'ai un petit problème cependant, en utilisant le [==] opérateur. Voici une forinstance:

JAVASCRIPT Code: [ Select ]
   dat1 = new Date("Sep 24 2010 08:57:00");
   dat2 = new Date("Sep 24 2010 08:57:00");
   
   if(dat1 == dat2)
   {
      alert('Dates are equal!\n'+dat1+'\n'+dat2);
   } else {
      alert('Dates are NOT equal!\n'+dat1+'\n'+dat2);
   }
 
  1.    dat1 = new Date("Sep 24 2010 08:57:00");
  2.    dat2 = new Date("Sep 24 2010 08:57:00");
  3.    
  4.    if(dat1 == dat2)
  5.    {
  6.       alert('Dates are equal!\n'+dat1+'\n'+dat2);
  7.    } else {
  8.       alert('Dates are NOT equal!\n'+dat1+'\n'+dat2);
  9.    }
  10.  


Le message est incompréhensible...

"Dates ne sont pas égaux»
"Sep 2040 08:57:00 Ven 24 GMT-700 (Heure avancée du Pacifique)"
"Sep 2040 08:57:00 Ven 24 GMT-700 (Heure avancée du Pacifique)"

Toute idée de ce qui continue? Ce qui se passe dans Chrome 7 et IE.
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Septembre 24th, 2010, 9:36 am

Code: [ Select ]
if(dt1-0 == dt2-0)


Comparable au style utilisé par MySQL.
Strong with this one, the sudo is.
  • tjcrowder
  • Newbie
  • Newbie
  • No Avatar
  • Inscription: Fév 27, 2010
  • Messages: 5
  • Status: Offline

Message Septembre 24th, 2010, 10:54 am

La raison en est que l'opérateur d'égalité (==) ne compare pas la même chose que les opérateurs relationnels tels que <et> comparer.

Lorsque vous utilisez == pour comparer deux «variables» qui font référence à des objets, le résultat est true si les variables point à l' même objet , Et fausse si elles n'ont pas, à l'exception du nombre et instances de String, qui ont un traitement spécial. (Voir la section 11.9.3 de la spécification. )

En revanche, les opérateurs relationnels essayer d'obtenir des valeurs primitives pour les objets (si les objets ont des valeurs primitives), puis de comparer ces lieu. Date objets ont une valeur primitive (le nombre de millisecondes depuis l'époque) et ainsi les opérateurs relationnels comparer ces valeurs.

Une conséquence de ceci est que (de prêter à confusion!) Date deux cas peut être! = Même si elles ne sont ni <ou> de l'autre. Et thats exactement ce que vous avez dans votre exemple, deux différent des objets qui représentent le même moment dans le temps. (Eh bien, au moins, vous êtes très très susceptibles d'avoir leur représentant au même moment dans le temps, bien que techniquement vous en créer un, puis créer les autres, afin qu'ils puissent être d'une milliseconde ou deux de congé.)

Heres un exemple vivant: jsbin dot com/ikude4/2

Vous pouvez facilement comparer deux objets date de la manière que vous vouliez. J'ai l'habitude de le faire le long chemin, en appelant explicitement getTime (qui retourne le nombre):

JAVASCRIPT Code: [ Select ]
if (d1.getTime() == d2.getTime()) {

...parce que son tout à fait clair ce que je fais, mais theres une manière plus délicate que certaines personnes préfèrent:

JAVASCRIPT Code: [ Select ]
if (+d1 == +d2) {

Le signe plus (+) fait la même chose "primitive obtenir une valeur numérique" chose que les opérateurs relationnels faire, et ainsi de ce qui précède compare les chiffres plutôt que les instances d'objets. Heres l'exemple ci-dessus à l'aide + au lieu de getTime (): jsbin dot com/ikude4

HTH,
-
TJ Crowder
Consultant de logiciels indépendants
TJ logiciels Crowder / / com
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Septembre 24th, 2010, 11:25 pm

Bien que je ne vois pas un navigateur jamais le faire assez souvent pour faire une différence notable dans une application, les résultats de Im faire le test suivant peu intéressantes.

Je m'attendais à la version arithmétique pour être plus rapide que l'appel de fonction. Cependant, il semble l'appel de fonction est le plus rapide des trois, où Im séance.

JAVASCRIPT Code: [ Select ]
   var   stamps = {
      s1: new Date(),
      e1: new Date(),
      s2: new Date(),
      e2: new Date(),
      s3: new Date(),
      e3: new Date(),
   };
   
   stamps.s1 = new Date();
   for(var i = 0; i < 100000; i++)
   {
      if(+stamps.s1 == +stamps.e1) {}
   }
   stamps.e1 = new Date();
   
   stamps.s2 = new Date();
   for(var i = 0; i < 100000; i++)
   {
      if(stamps.s2.getTime() == stamps.e2.getTime()) {}
   }
   stamps.e2 = new Date();
   
   stamps.s3 = new Date();
   for(var i = 0; i < 100000; i++)
   {
      if(stamps.s3-0 == stamps.e3-0) {}
   }
   stamps.e3 = new Date();
   
   alert((stamps.e1.getTime() - stamps.s1.getTime()) + "\n" + (stamps.e2.getTime() - stamps.s2.getTime()) + "\n" + (stamps.e3.getTime() - stamps.s3.getTime()));
  1.    var   stamps = {
  2.       s1: new Date(),
  3.       e1: new Date(),
  4.       s2: new Date(),
  5.       e2: new Date(),
  6.       s3: new Date(),
  7.       e3: new Date(),
  8.    };
  9.    
  10.    stamps.s1 = new Date();
  11.    for(var i = 0; i < 100000; i++)
  12.    {
  13.       if(+stamps.s1 == +stamps.e1) {}
  14.    }
  15.    stamps.e1 = new Date();
  16.    
  17.    stamps.s2 = new Date();
  18.    for(var i = 0; i < 100000; i++)
  19.    {
  20.       if(stamps.s2.getTime() == stamps.e2.getTime()) {}
  21.    }
  22.    stamps.e2 = new Date();
  23.    
  24.    stamps.s3 = new Date();
  25.    for(var i = 0; i < 100000; i++)
  26.    {
  27.       if(stamps.s3-0 == stamps.e3-0) {}
  28.    }
  29.    stamps.e3 = new Date();
  30.    
  31.    alert((stamps.e1.getTime() - stamps.s1.getTime()) + "\n" + (stamps.e2.getTime() - stamps.s2.getTime()) + "\n" + (stamps.e3.getTime() - stamps.s3.getTime()));
Strong with this one, the sudo is.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Septembre 24th, 2010, 11:25 pm

Afficher de l'information

  • Total des messages de ce sujet: 16 messages
  • Utilisateurs parcourant ce forum: demonmaestro et 214 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC