Fecha comparación Javascript

  • Hari Narayanan
  • Graduate
  • Graduate
  • No Avatar
  • Registrado: Jun 07, 2005
  • Mensajes: 103
  • Status: Offline

Nota Junio 22nd, 2005, 1:37 am

Hola a todos

¿Cómo comparar dos fechas con Javascript?

[Al igual que cómo lo hacemos utilizando datediff VBScript () función, pero los navegadores no-IE no analizará VBScript! ].
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Junio 22nd, 2005, 1:37 am

  • Dark Uncle
  • Beginner
  • Beginner
  • No Avatar
  • Registrado: Jun 21, 2005
  • Mensajes: 46
  • Status: Offline

Nota Junio 22nd, 2005, 2:07 am

Código: [ 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>


Tomado de http://codepunk.hardwar.org.uk/ajs07.htm
  • Hari Narayanan
  • Graduate
  • Graduate
  • No Avatar
  • Registrado: Jun 07, 2005
  • Mensajes: 103
  • Status: Offline

Nota Junio 22nd, 2005, 2:07 am

Got it!
Heres el código.....

Código: [ 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 Usuario
  • Registrado: Sep 07, 2004
  • Mensajes: 2390
  • Loc: Edinburgh, Scotland
  • Status: Offline

Nota Junio 22nd, 2005, 2:16 am

Javascript tiene el objeto de fecha, así que si usted tendrá que crear las dos fechas para comparar, es decir:
Código: [ 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


Para calcular la diferencia, tanto para convertir sus representaciones milisegundos y restar:

Código: [ 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;

En este caso, la diferencia será negativa, como d1 precede D2.
Para el número de días entre las dos fechas:
Código: [ Select ]
var num_days = (((diff / 1000) / 60) / 60) / 24;


No es tan fácil como VBScript hace 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
  • Registrado: Feb 10, 2004
  • Mensajes: 13455
  • Loc: Florida
  • Status: Offline

Nota Junio 22nd, 2005, 2:27 am

Código: [ Select ]
1000*60*60*24

Tip escribió:
Cuando las matemáticas se ocupan de las constantes que se descubre, en sustitución de la ecuación con su resultado, en este caso 86400000, requiere de sistemas de ejecución de la aplicación para hacer menos trabajo.
Strong with this one, the sudo is.
  • George_Gambino
  • Student
  • Student
  • No Avatar
  • Registrado: Oct 02, 2004
  • Mensajes: 89
  • Status: Offline

Nota Agosto 23rd, 2008, 11:52 pm

Comparar dos fechas en Javascript es todo acerca del uso de la Fecha () objeto, como se refirió también en un par de puestos ya. Heres un buen artículo sobre cómo comprobar si una fecha introducida a través de un formulario de campo es anterior a la fecha de hoy:

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

Gambino
  • tjcrowder
  • Newbie
  • Newbie
  • No Avatar
  • Registrado: Feb 27, 2010
  • Mensajes: 5
  • Status: Offline

Nota Febrero 27th, 2010, 10:35 am

Para el beneficio de cualquier otro obstáculo a través de este hilo, la mayoría de las respuestas anteriores se trabaja demasiado. :D

Si quieres saber si un caso, la fecha es anterior a otro, simplemente use la < operador, que se define como la comparación de los valores primitivos de los objetos. El valor primitivo de un objeto Date es su milisegundos-ya-El valor de época (también conocido como Fecha #getTime ), Ver secciones 9.1 y 15.9 de la especificación de ECMA 3 ª edición. Por lo tanto < , == , Y > trabajar como usted espera que ellos, sin necesidad de llamar explícitamente getTime () .

La aritmética se hace de la misma manera. Resta una fecha de otra fecha y el resultado es la diferencia en milisegundos. (La suma es un poco extraño, ya que lo que estás agregando sus valores es época, por lo que el resultado no va a significar mucho.)
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13455
  • Loc: Florida
  • Status: Offline

Nota Febrero 27th, 2010, 11:47 am

Yo que pensaba que comparar dos fechas a través de <=> se invoca el método toString del objeto de la fecha y terminan comparando las cadenas devueltas. Im aún no están seguros si thats whats sucediendo realmente. :scratchhead: Seguro que sería bueno si yo sabía de qué parte de la opinión, Firefox o el código fuente de Chrome que debo mirar para averiguarlo.
Strong with this one, the sudo is.
  • tjcrowder
  • Newbie
  • Newbie
  • No Avatar
  • Registrado: Feb 27, 2010
  • Mensajes: 5
  • Status: Offline

Nota Febrero 28th, 2010, 1:33 am

@ joebert:
Quote:
Yo que pensaba que comparar dos fechas a través de <=> se invoca el método toString del objeto de la fecha y terminan comparando las cadenas devueltas.

No, los compara a través de valueOf, que por fecha es la misma que getTime.
Quote:
Seguro que sería bueno si yo sabía de qué parte de la opinión, Firefox o el código fuente de Chrome que debo mirar para averiguarlo.

No hay necesidad de ordenar a través de código fuente, el pliego de condiciones (ECMA-internacional. org / publications / standards / ECMA-262.htm) es claro, sólo tiene a las secciones de referencia. Comience con 11.8.5 ( "El Resumen de comparación relacional algoritmo") que nos dice que los valores se compararon mediante la [[ToPrimitive]] en cooperación con la pista "" Número. Dirígete a la sección 9.1 ( "ToPrimitive") y nos dice que para los objetos, [[ToPrimitive]] sólo pasa a través de la [[DefaultValue]], pasando sobre la pista. Dirígete a 8.12. 8 ( "DefaultValue (pista)") y nos dice si la pista es número y el objeto tiene un valueOf, valueOf uso itll. Así que echa un vistazo a las fechas valueOf (15.9.5.8) y dice que vuelve ", este valor de tiempo" que es la manera de decir las especificaciones de número de milisegundos desde la época (leer la introducción del objeto Date [15.9.1, 15.9.1.1 ] para verificar esto). Convenientemente, la sección siguiente, (15.9.5.9) es getTime, que dice lo mismo.

(Los números de sección son de especificaciones de la nueva 5 ª edición, pero la ECMA se muy inteligente y evitarse cambiando los números de sección donde podían. En la 3 ª edición de especificaciones, la única diferencia es que "[[DefaultValue]] (pista)" es 8.6.2.6 en lugar de 8.12.8.)

También es trivial para probar esto experimentalmente:
Código: [ 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"

Como puede ver, no su uso de toString cuando relacionalmente comparar casos Fecha.

(En la anterior, «escribir» es cualquier mecanismo de salida que desea utilizar, sino que debe ser seguro para el tratamiento de lo que recibe como una cadena, o puede salida -1 en lugar de lo verdadero y 0 en vez de falsa - que es lo mismo cosa, pero la menos clara.)
--
TJ Crowder
Consultor Independiente de Software
TJ / software Crowder com /
com www crowdersoftware
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13455
  • Loc: Florida
  • Status: Offline

Nota Febrero 28th, 2010, 1:11 pm

Id a decir como a las especificaciones y la aplicación a veces las cosas son diferentes, pero su difícil discutir con ese puesto. Explicación de Niza, TJ :D
Strong with this one, the sudo is.
  • tjcrowder
  • Newbie
  • Newbie
  • No Avatar
  • Registrado: Feb 27, 2010
  • Mensajes: 5
  • Status: Offline

Nota Febrero 28th, 2010, 1:40 pm

@ joebert:
Quote:
Explicación de Niza, TJ

Gracias!
Quote:
Id gusta decir las especificaciones y la aplicación a veces son diferentes cosas...

Si. :D Thats donde el experimento entra lo general me gusta saber lo que su supone que debe hacer, a continuación, comprobar que lo que realmente lo hace.

- TJ
  • Psyborg
  • Born
  • Born
  • No Avatar
  • Registrado: Sep 24, 2010
  • Mensajes: 1
  • Status: Offline

Nota Septiembre 24th, 2010, 8:58 am

Ok, gracias por todo los comentarios anteriores, theyre todo muy bien pensado y útil.

Tengo un pequeño problema, sin embargo, utilizando el [operador ==]. Aquí está un forinstance:

JAVASCRIPT Código: [ 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.  


El mensaje es desconcertante...

"Las fechas no son iguales"
"Vie 24 septiembre 2040 08:57:00 GMT-700 (Hora de verano del Pacífico)"
"Vie 24 septiembre 2040 08:57:00 GMT-700 (Hora de verano del Pacífico)"

Cualquier idea que está pasando? Esto ocurre en Chrome 7 y IE.
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13455
  • Loc: Florida
  • Status: Offline

Nota Septiembre 24th, 2010, 9:36 am

Código: [ Select ]
if(dt1-0 == dt2-0)


Al igual que el estilo usado en MySQL.
Strong with this one, the sudo is.
  • tjcrowder
  • Newbie
  • Newbie
  • No Avatar
  • Registrado: Feb 27, 2010
  • Mensajes: 5
  • Status: Offline

Nota Septiembre 24th, 2010, 10:54 am

La razón es que el operador de igualdad (==) no está comparando lo mismo que los operadores relacionales como <y> comparar.

Cuando se utiliza para comparar dos == "variables" que se refieren a objetos, el resultado es verdadero si las variables apuntan a la mismo objeto , Y falsa si no lo hacen, con la excepción del número y los casos de cuerdas, que tienen un manejo especial. (Vea la Sección 11.9.3 de la especificación. )

Por el contrario, los operadores relacionales tratar de obtener los valores primitivos de los objetos (si los objetos tienen valores primitivos) y luego comparar estos en su lugar. Fecha objetos tienen un valor primitivo (el número de milisegundos desde la época) y así los operadores relacionales comparan esos valores.

Una consecuencia de esto es que (confusión!) Fecha dos instancias puede ser! = A pesar de que no son ni <o> entre sí. Y eso es exactamente lo que usted tiene en su ejemplo, dos diferente objetos que representan el mismo momento en el tiempo. (Bueno, al menos, eres muy muy probable que los representen en el mismo momento en el tiempo, aunque técnicamente se crean y luego crear una la otra, por lo que podría ser una milésima de segundo o dos fuera.)

Heres un ejemplo vivo: jsbin punto com/ikude4/2

Usted puede comparar dos objetos de la fecha de la manera que quería. Por lo general lo hacen el camino más largo, llamando explícitamente a getTime (que devuelve el número):

JAVASCRIPT Código: [ Select ]
if (d1.getTime() == d2.getTime()) {

...debido a que su completamente claro lo que estoy haciendo, pero hay un camino más difícil que algunas personas prefieren:

JAVASCRIPT Código: [ Select ]
if (+d1 == +d2) {

El signo más (+) hace lo mismo "tener valor numérico primitivo" lo que los operadores relacionales hacer, y lo que lo anterior se comparan los números en lugar de las instancias de objetos. Heres el ejemplo anterior usando + en lugar de getTime (): jsbin punto com/ikude4

HTH,
-
TJ Crowder
Consultor de software independientes
tj / software Crowder / com
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13455
  • Loc: Florida
  • Status: Offline

Nota Septiembre 24th, 2010, 11:25 pm

Aunque no veo un navegador nunca hacer esto con frecuencia suficiente como para hacer una diferencia notable en la solicitud, los resultados me estoy desde el pequeño test siguientes son interesantes.

Yo esperaba que la versión de la aritmética al ser más rápido que la llamada a función. Sin embargo parece que la llamada a la función es el más rápido de los tres, donde Im sesión.

JAVASCRIPT Código: [ 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
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Septiembre 24th, 2010, 11:25 pm

Publicar Información

  • Total de mensajes en este tema: 16 mensajes
  • Usuarios navegando por este Foro: webspace y 129 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC