validar validacion formularios formulario espaƱol enviar ejemplos descargar definicion con antes javascript date comparison mootools

validacion - Comparando la parte de la fecha solo sin comparar el tiempo en JavaScript



validar formulario javascript antes de enviar (15)

CUIDADO CON EL TIMEZONE

El uso del objeto de fecha para representar solo una fecha le lleva a un enorme problema de precisión excesiva. Necesitas administrar el tiempo y la zona horaria para mantenerlos alejados, y pueden volver a colarse en cualquier momento. La respuesta aceptada a esta pregunta cae en la trampa.

Una fecha de javascript no tiene noción de zona horaria . Es un momento en el tiempo (marca desde la época) con funciones prácticas (estáticas) para traducir desde y hacia cadenas, utilizando la zona horaria "local" del dispositivo o, si se especifica, UTC. Para representar una fecha con un objeto de fecha, desea que sus fechas representen la medianoche UTC al comienzo de la fecha en cuestión. Esta es una convención común y necesaria que le permite trabajar con fechas independientemente de la temporada o la zona horaria de su creación. Por lo tanto, debe estar muy atento para administrar la noción de zona horaria, tanto cuando cree su objeto UTC Date de medianoche como cuando lo serialice.

Deserialización (o creación de objetos de fecha UTC de medianoche)

La mayoría de las veces, deseará que su fecha refleje la zona horaria del usuario. Haz click si hoy es tu cumpleaños . Los usuarios de Nueva Zelanda y EE. UU. Hacen clic al mismo tiempo y obtienen diferentes fechas. En ese caso, haz esto ...

// create a date (utc midnight) reflecting the value of myDate and the environment''s timezone offset. new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

A veces, la comparabilidad internacional triunfa sobre la precisión local. En ese caso, haz esto ...

// the date in London of a moment in time. Device timezone is ignored. new Date(Date.UTC(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

Deserializar una fecha

A menudo, las fechas en el cable estarán en el formato AAAA-MM-DD. Para deserializarlos, haz esto ...

var midnightUTCDate = new Date( dateString + ''T00:00:00Z'');

Serializacion

Al tener cuidado de administrar la zona horaria cuando creas, ahora debes asegurarte de mantener fuera de la zona horaria cuando vuelvas a convertir a una representación de cadena. Así que puedes usar con seguridad ...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

Y evita totalmente todo lo demás, especialmente ...

  • getYear() , getMonth() , getDate()

Así que para responder a tu pregunta, 7 años demasiado tarde ...

<input type="date" onchange="isInPast(event)"> <script> var isInPast = function(event){ debugger; var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone! var now = new Date(); var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() )); if(userEntered.getTime() < today.getTime()) alert("date is past"); else if(userEntered.getTime() == today.getTime()) alert("date is today"); else alert("date is future"); } </script>

Velo corriendo ...

¿Qué está mal con el código de abajo?

Tal vez sería más simple comparar la fecha y no la hora. Tampoco estoy seguro de cómo hacer esto y busqué, pero no pude encontrar mi problema exacto.

Por cierto, cuando muestro las dos fechas en una alerta, se muestran exactamente iguales.

Mi código:

window.addEvent(''domready'', function() { var now = new Date(); var input = $(''datum'').getValue(); var dateArray = input.split(''/''); var userMonth = parseInt(dateArray[1])-1; var userDate = new Date(); userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds()); if (userDate > now) { alert(now + ''/n'' + userDate); } });

¿Hay una forma más sencilla de comparar fechas y no incluir el tiempo?


Utilizando Moment.js

Si tiene la opción de incluir una biblioteca de terceros, definitivamente vale la pena echar un vistazo a Moment.js . Hace mucho más fácil trabajar con Date and DateTime .

Por ejemplo, al ver si una Fecha viene después de otra Fecha pero excluyendo sus horarios, haría algo como esto:

var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00 var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00 // Comparison including time. moment(date2).isAfter(date1); // => true // Comparison excluding time. moment(date2).isAfter(date1, ''day''); // => false

El segundo parámetro que se pasa a isAfter es la precisión para realizar la comparación y puede ser cualquiera de year , month , week , day , hour , minute o second .


¿Qué tal esto?

Date.prototype.withoutTime = function () { var d = new Date(this); d.setHours(0, 0, 0, 0); return d; }

Le permite comparar la parte de la fecha como esta sin afectar el valor de su variable:

var date1 = new Date(2014,1,1); new Date().withoutTime() > date1.withoutTime(); // true


Así es como lo hago:

var myDate = new Date($(''input[name=frequency_start]'').val()).setHours(0,0,0,0); var today = new Date().setHours(0,0,0,0); if(today>myDate){ jAlert(''Please Enter a date in the future'',''Date Start Error'', function(){ $(''input[name=frequency_start]'').focus().select(); }); }


Asegúrese de construir userDate con un año de 4 dígitos como setFullYear(10, ...) !== setFullYear(2010, ...) .


Como no veo aquí un enfoque similar, y no estoy disfrutando la configuración de h / m / s / ms a 0, ya que puede causar problemas con la transición precisa a la zona horaria local con el objeto de date cambiado (supongo que sí), vamos Me presento aquí esto, escrito hace unos momentos, lil función:

+ : Fácil de usar, realiza una comparación básica de operaciones (comparando día, mes y año sin tiempo).
- : Parece que esto es todo lo contrario de pensar "fuera de la caja".

function datecompare(date1, sign, date2) { var day1 = date1.getDate(); var mon1 = date1.getMonth(); var year1 = date1.getFullYear(); var day2 = date2.getDate(); var mon2 = date2.getMonth(); var year2 = date2.getFullYear(); if (sign === ''==='') { if (day1 === day2 && mon1 === mon2 && year1 === year2) return true; else return false; } else if (sign === ''>'') { if (year1 > year2) return true; else if (year1 === year2 && mon1 > mon2) return true; else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true; else return false; } }

Uso:

datecompare(date1, ''==='', date2) para verificar la igualdad,
datecompare(date1, ''>'', date2) para mayor comprobación,
!datecompare(date1, ''>'', date2) por cheque menor o igual

Además, obviamente, puede cambiar date1 y date2 en lugares para lograr cualquier otra comparación simple.


Después de leer esta pregunta al mismo tiempo que se publicó, decidí publicar otra solución, ya que no la encontré tan satisfactoria, al menos para mis necesidades:

He usado algo como esto:

var currentDate= new Date().setHours(0,0,0,0); var startDay = new Date(currentDate - 86400000 * 2); var finalDay = new Date(currentDate + 86400000 * 2);

De esa manera podría haber usado las fechas en el formato que quería para procesarlas más tarde. Pero esto fue solo para mi necesidad, pero he decidido publicarlo de todos modos, tal vez ayude a alguien


Esta podría ser una versión un poco más limpia, también tenga en cuenta que siempre debe usar un radix cuando use parseInt.

new Date().toDateString();

parseInt página de parseInt MDC para obtener más información sobre el radix.

JSLint es una gran herramienta para atrapar cosas como un radix faltante y muchas otras cosas que pueden causar errores oscuros y difíciles de depurar. Te obliga a utilizar mejores estándares de codificación para evitar futuros dolores de cabeza. Lo uso en cada proyecto de JavaScript que codifico.


Esto ayudará. Me las arreglé para conseguirlo así.

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())


La biblioteca date.js es útil para estas cosas. Facilita mucho todos los scripts relacionados con JS date.


Puedes usar alguna aritmética con el total de ms.

var date = new Date(date1); date.setHours(0, 0, 0, 0); var diff = date2.getTime() - date.getTime(); return diff >= 0 && diff < 86400000;

Me gusta esto porque no se realizan actualizaciones a las fechas originales y se realizan más rápido que la división de cadenas y la comparación.

¡Espero que esto ayude!


Sé que esta pregunta ya ha sido respondida y puede que esta no sea la mejor manera, pero en mi caso está funcionando perfectamente, así que pensé que podría ayudar a alguien como yo.

si tienes una date string como

String dateString="2018-01-01T18:19:12.543";

y solo desea comparar la parte de la fecha con otro objeto Date en JS,

var anotherDate=new Date(); //some date

luego tiene que convert la string en el objeto Date utilizando la new Date("2018-01-01T18:19:12.543");

Y aquí está el truco: -

var valueDate =new Date(new Date(dateString).toDateString()); return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

He usado toDateString() del Date object de JS, que solo devuelve la cadena Date.

Nota: No olvide utilizar la función .valueOf() al comparar las fechas.

más información sobre .valeOf() es reference aquí

Feliz codding


Simplemente compare usando .toDateString como a continuación:

window.addEvent(''domready'', function() { // Create a Date object set to midnight on today''s date var today = new Date((new Date()).setHours(0, 0, 0, 0)), input = $(''datum'').getValue(), dateArray = input.split(''/''), // Always specify a radix with parseInt(), setting the radix to 10 ensures that // the number is interpreted as a decimal. It is particularly important with // dates, if the user had entered ''09'' for the month and you don''t use a // radix ''09'' is interpreted as an octal number and parseInt would return 0, not 9! userMonth = parseInt(dateArray[1], 10) - 1, // Create a Date object set to midnight on the day the user specified userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0); // Convert date objects to milliseconds and compare if(userDate.getTime() > today.getTime()) { alert(today+''/n''+userDate); } });

Esto te devolverá solo la parte de la fecha y no la hora ni la zona horaria, como esto

"Vie feb 03 2017"

Por lo tanto, ambas fechas se pueden comparar en este formato de la misma manera sin parte del tiempo.


Todavía estoy aprendiendo JavaScript, y la única forma en que encontré la que me sirve para comparar dos fechas sin el tiempo es usar el método setHours del objeto Date y configurar las horas, minutos, segundos y milisegundos a cero. Luego compara las dos fechas.

Por ejemplo,

date1 = new Date() date2 = new Date(2011,8,20)

date2 se configurará con las horas, minutos, segundos y milisegundos a cero, pero date1 los establecerá a la hora en que se creó date1. Para deshacerse de las horas, minutos, segundos y milisegundos en date1, haga lo siguiente:

date1.setHours(0,0,0,0)

Ahora puede comparar las dos fechas como FECHAS solo sin preocuparse por los elementos de tiempo.


Una forma eficiente y correcta de comparar fechas es:

Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);

Ignora la parte de tiempo, funciona para diferentes zonas horarias y también puede comparar para la igualdad == . 86400000 es el número de milisegundos en un día ( = 24*60*60*1000 ).

Tenga en cuenta que el operador de igualdad == nunca debe usarse para comparar objetos de fecha porque falla cuando se espera que una prueba de igualdad funcione porque está comparando dos objetos de fecha (y no compara las dos fechas), por ejemplo:

> date1; outputs: Thu Mar 08 2018 00:00:00 GMT+1300 > date2; outputs: Thu Mar 08 2018 00:00:00 GMT+1300 > date1 == date2; outputs: false > Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000); outputs: true

Notas: Si está comparando objetos Date que tienen la parte de tiempo establecida en cero, entonces podría usar date1.getTime() == date2.getTime() pero la optimización apenas vale la pena. Puede usar < , > , <= o >= al comparar objetos de fecha directamente porque estos operadores primero convierten el objeto de fecha llamando a .valueOf() antes de que el operador .valueOf() la comparación.