¿Qué hay de malo con el siguiente código?
Quizás 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 igual.
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 manera más simple de comparar fechas y no incluir la hora?
fuente
date1 === date2
no parecen proporcionar un comportamiento coherente; Es mejor hacerlodate1.valueOf() === b.valueOf()
o inclusodate1.getTime() === date2.getTime()
. Extrañeza.var date2 = new Date(2011,8,20)
. Ahora cambie la zona horaria del sistema operativo a la hora del Pacífico (EE. UU.). En el mismo tipo de consola del navegador,date2.toDateString()
¡volverás enMon Sep 19 2011
lugar del martes 20!setHours()
establece el tiempo en función de la zona horaria actual, que detecta automáticamente el navegador. Probar:t = new Date("2016-02-29T01:45:49.098Z");
t.setHours(0,0,0,0);
console.log(t.toJSON());
imprimirá"2016-02-28T15:00:00.000Z"
, fecha 28, pero no 29 Mi zona horaria actual esAsia/Tokyo
setUTCxxx
métodos en lugar de las variantes locales / de zona horaria.CUIDADO CON LA TIMEZONE
Usar el objeto de fecha para representar solo una fecha de inmediato lo lleva a un gran problema de exceso de precisión. Debe administrar el tiempo y la zona horaria para mantenerlos alejados, y pueden 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 prácticas funciones (estáticas) para traducir hacia y desde cadenas, utilizando de forma predeterminada la zona horaria "local" del dispositivo o, si se especifica, UTC u otra zona horaria. Para representar just-a-date ™ 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 zona horaria de su creación. Por lo tanto, debe estar muy atento para administrar la noción de zona horaria, tanto cuando crea su objeto UTC Date de medianoche como cuando lo serializa.
Mucha gente está confundida por el comportamiento predeterminado de la consola. Si aplica una fecha a la consola, la salida que verá incluirá su zona horaria. Esto es solo porque la consola llama
toString()
a tu cita ytoString()
te da una representación local. ¡La fecha subyacente no tiene zona horaria ! (Mientras la hora coincida con el desplazamiento de la zona horaria, todavía tiene un objeto de fecha UTC de medianoche)Deserialización (o creación de objetos UTC Date a medianoche)
Este es el paso de redondeo, con el truco de que hay dos respuestas "correctas". La mayoría de las veces, querrá que su fecha refleje la zona horaria del usuario. Haz clic si hoy es tu cumpleaños . Los usuarios de NZ y EE. UU. Hacen clic al mismo tiempo y obtienen fechas diferentes. En ese caso, haz esto ...
A veces, la comparabilidad internacional supera la precisión local. En ese caso, haz esto ...
Deserializar una fecha
A menudo, las fechas en el cable tendrán el formato AAAA-MM-DD. Para deserializarlos, haz esto ...
Serializando
Habiendo tenido cuidado de administrar la zona horaria cuando crea, ahora debe asegurarse de mantener la zona horaria fuera cuando convierta nuevamente a una representación de cadena. Para que pueda 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()
Entonces, para responder a su pregunta, 7 años demasiado tarde ...
Véalo correr ...
Actualización 2019 ... cosas gratis ...
Dada la popularidad de esta respuesta, lo puse todo en código. La siguiente función devuelve un objeto de fecha envuelta y solo expone aquellas funciones que son seguras de usar con just-a-date ™.
Llámalo con un objeto Date y se resolverá en JustADate reflejando la zona horaria del usuario. Llámalo con una cadena: si la cadena es un ISO 8601 con la zona horaria especificada, simplemente redondearemos la parte del tiempo. Si no se especifica la zona horaria, la convertiremos a una fecha que refleje la zona horaria local, al igual que para los objetos de fecha.
fuente
¿Qué tal esto?
Le permite comparar la parte de fecha de la fecha de esta manera sin afectar el valor de su variable:
fuente
Usando Moment.js
Si tiene la opción de incluir una biblioteca de terceros, definitivamente vale la pena echarle un vistazo a Moment.js . Esto hace que el trabajo con
Date
yDateTime
mucho, mucho más fácil.Por ejemplo, al ver si una Fecha viene después de otra Fecha pero excluyendo sus horas, haría algo como esto:
El segundo parámetro que toma en
isAfter
es la precisión de hacer la comparación y puede ser cualquiera deyear
,month
,week
,day
,hour
,minute
osecond
.fuente
Simplemente compare usando .toDateString como a continuación:
Esto le devolverá la fecha solo parte y no la hora o zona horaria, como esta:
Por lo tanto, ambas fechas se pueden comparar en este formato del mismo modo sin tiempo.
fuente
new Date(new Date().toDateString());
Esta podría ser una versión un poco más limpia, también tenga en cuenta que siempre debe usar una raíz cuando use parseInt.
Consulte la página parseInt de MDC para obtener más información sobre la raíz.
JSLint es una gran herramienta para atrapar cosas como una raíz perdida y muchas otras cosas que pueden causar errores oscuros y difíciles de depurar. Te obliga a usar mejores estándares de codificación para evitar futuros dolores de cabeza. Lo uso en cada proyecto de JavaScript que codifico.
fuente
La biblioteca date.js es útil para estas cosas. Hace que todas las secuencias de comandos relacionadas con la fecha de JS sean mucho más fáciles.
fuente
Si realmente está comparando la fecha sin un componente de tiempo, otra solución que puede parecer incorrecta pero que funciona y evita todos los
Date()
dolores de cabeza de tiempo y zona horaria es comparar la fecha de la cadena ISO directamente usando la comparación de cadenas:Puede obtener la fecha actual (fecha UTC, no necesariamente la fecha local del usuario) usando:
Mi argumento a favor es la simplicidad del programador: es mucho menos probable que arruines esto que tratar de manejar las fechas y las compensaciones correctamente, probablemente a costa de la velocidad (no he comparado el rendimiento)
fuente
new Date().toISOString().substr(0, 10) // "2019-04-22"
.new Date().toLocaleDateString() // "8/26/2019"
. Pero luego comparar el texto no será exacto (como"8/26/2019" >= "9/29/2001"
es falso). Por lo tanto, deberá convertirlonew Date(new Date().toLocaleDateString())
para compararlo con precisión con otra fecha.Solo use toDateString () en ambas fechas. toDateString no incluye la hora, por lo que durante 2 veces en la misma fecha, los valores serán iguales, como se demuestra a continuación.
Obviamente, algunas de las preocupaciones de zona horaria expresadas en otra parte sobre esta pregunta son válidas, pero en muchos escenarios, no son relevantes.
fuente
Así es como lo hago:
fuente
getTime()
es obligatorio?setHours()
modifica el objeto al que se llama y devuelve la fecha como un número de milisegundos (equivalente a la llamadagetTime()
). Por lo tanto, sutoday
variable no es unDate
objeto como algunos esperarían, sino que en realidad es un número entero de milisegundos. Como efecto secundario, esta es la razón por la que no necesitaba llamargetTime()
antes de comparar, ya que lo ha hecho de una manera oscura.Como no veo aquí un enfoque similar, y no estoy disfrutando de establecer h / m / s / ms en 0, ya que puede causar problemas con la transición precisa a la zona horaria local con un
date
objeto cambiado (supongo que sí), permítanme introduce aquí esto, escrito hace unos momentos, función lil:+
: Fácil de usar, realiza operaciones básicas de comparación (comparación de día, mes y año sin tiempo)-
: Parece que esto es completamente opuesto al pensamiento " listo para usar ".Uso:
datecompare(date1, '===', date2)
para verificación de igualdad,datecompare(date1, '>', date2)
para verificación mayor,!datecompare(date1, '>', date2)
para verificación menor o igualAdemás, obviamente, puede cambiar
date1
ydate2
en algunos lugares para lograr cualquier otra comparación simple.fuente
Una forma eficiente y correcta de comparar fechas es:
Ignora la parte del 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
==
debe nunca se puede utilizar para comparar los objetos Date, ya que falla cuando se puede esperar una prueba de la igualdad de trabajo, ya que está comparando dos objetos Fecha (y no se puede comparar las dos fechas), por ejemplo:Notas: Si está comparando objetos Date que tienen la parte de tiempo establecida en cero, entonces podría usarla,
date1.getTime() == date2.getTime()
pero no vale la pena la optimización. Se puede utilizar<
,>
,<=
, o>=
cuando se comparan los objetos Date directamente debido a que estos operadores primero convertir el objeto Date llamando.valueOf()
antes de que el operador realiza la comparación.fuente
Después de leer esta pregunta casi al mismo tiempo después de su publicación, he decidido publicar otra solución, ya que no la encontré muy satisfactoria, al menos para mis necesidades:
He usado algo como esto:
De esa manera, podría haber usado las fechas en el formato que quería para procesar después. Pero esto fue solo para mi necesidad, pero he decidido publicarlo de todos modos, tal vez ayude a alguien
fuente
currentDate
variable no es una fecha, es un número de milisegundos desde 1970-01-01. ElsetHours()
método modifica el objeto de fecha en el que se invoca y devuelve el equivalente degetTime()
(valor de fecha en milisegundos desde 1970-01-01).Asegúrese de construir
userDate
con un año de 4 dígitos comosetFullYear(10, ...) !== setFullYear(2010, ...)
.fuente
Puede usar algo de aritmética con el total de ms.
Me gusta porque no se realizan actualizaciones a las fechas originales y se realizan más rápido que la división y comparación de cadenas.
¡Espero que esto ayude!
fuente
Este JS cambiará el contenido después de la fecha establecida, esto es lo mismo pero en w3schools
fuente
Esto funciona para mi:
En la respuesta aceptada, hay un problema de zona horaria y en el otro momento no son las 00:00:00
fuente
Sé que esta pregunta ya ha sido respondida y esta puede no ser la mejor manera, pero en mi caso funciona perfectamente, así que pensé que podría ayudar a alguien como yo.
si tienes
date string
comoy solo quieres comparar la parte de la fecha con otro objeto Date en JS,
entonces usted tiene que
convert
lastring
deDate
objeto utilizandonew Date("2018-01-01T18:19:12.543");
y aquí está el truco:
He usado
toDateString()
deDate object
JS, que solo devuelve la cadena de fecha.Nota: No olvide usar la
.valueOf()
función al comparar las fechas.Más información sobre
.valeOf()
es aquí referenciaFeliz codificación
fuente
Esto ayudará. Me las arreglé para conseguirlo así.
fuente
Comparar con
setHours()
será una solución. Muestra:fuente
si su formato de fecha es diferente, use la biblioteca moment.js para convertir el formato de su fecha y luego use el código anterior para comparar dos fechas
Ejemplo:
Si su fecha está en "DD / MM / AAAA" y quiere convertirla en "MM / DD / AAAA", consulte el siguiente ejemplo de código
fuente
Puede usar fp_incr (0). Que establece la parte de zona horaria a medianoche y devuelve un objeto de fecha.
fuente