Comparando a parte da data apenas sem comparar o tempo no JavaScript

O que há de errado com o código abaixo?

Talvez fosse mais simples apenas comparar a data e não o tempo. Também não sei como fazer isso, e procurei, mas não consegui encontrar meu problema exato.

BTW, quando eu exibir as duas datas em um alerta, eles mostram exatamente o mesmo.

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

Existe uma maneira mais simples de comparar datas e não include o horário?

    Eu ainda estou aprendendo JavaScript, ea única maneira que eu encontrei que funciona para mim para comparar duas datas sem o tempo é usar o método setHours do object Date e definir as horas, minutos, segundos e milissegundos para zero. Em seguida, compare as duas datas.

    Por exemplo,

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

    date2 será definido com horas, minutos, segundos e milissegundos como zero, mas date1 os definirá para a hora em que date1 foi criado. Para se livrar das horas, minutos, segundos e milissegundos na data1, faça o seguinte:

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

    Agora você pode comparar as duas datas como DATAS somente sem se preocupar com elementos de tempo.

    Que tal agora?

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

    Ele permite que você compare a parte da data da data assim sem afetar o valor da sua variável:

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

    CUIDADO COM O FUSO HORÁRIO

    Usar o object date para representar imediatamente uma data coloca você em um enorme problema de excesso de precisão. Você precisa gerenciar tempo e fuso horário para mantê-los fora, e eles podem entrar de novo em qualquer etapa. A resposta aceita para essa pergunta cai na armadilha.

    Uma data de javascript não tem noção de fuso horário . É um momento no tempo (carrapatos desde a época) com funções práticas (estáticas) para traduzir para e de strings no fuso horário “local” do dispositivo. Para representar uma data com um object de data, você deseja que suas datas representem a meia-noite UTC no início da data em questão. Esta é uma convenção comum e necessária que permite trabalhar com datas, independentemente da estação ou fuso horário de sua criação. Portanto, você precisa estar muito atento para gerenciar a noção de fuso horário, especialmente quando cria o object de data UTC da meia-noite.

    Desserialização (ou criação de objects da data UTC da meia-noite)

    Na maioria das vezes, você desejará que sua data reflita o fuso horário do usuário. Clique se hoje for seu aniversário . Os usuários da NZ e dos EUA clicam ao mesmo tempo e obtêm datas diferentes. Nesse caso, faça isso …

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

    Às vezes, a comparabilidade internacional supera a precisão local. Nesse caso, faça isso …

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

    Desserializar uma data

    Muitas vezes, as datas no fio estarão no formato AAAA-MM-DD. Para desserializá-los, faça isso …

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

    Serializando

    Tendo tomado cuidado para gerenciar o fuso horário quando você cria, agora você precisa ter certeza de manter o fuso horário ao converter de volta para uma representação de string. Então você pode usar com segurança …

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

    E evite totalmente tudo mais, especialmente …

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

    Então, para responder a sua pergunta, 7 anos tarde demais …

       

    Veja correndo ...

    Usando Moment.js

    Se você tem a opção de include uma biblioteca de terceiros, vale a pena dar uma olhada no Moment.js . Isso torna muito mais fácil trabalhar com Date e DateTime .

    Por exemplo, vendo se uma data vem após outra data, mas excluindo seus horários, você faria algo assim:

     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 

    O segundo parâmetro para o qual você passa isAfter é a precisão para fazer a comparação e pode ser qualquer year , month , week , day , hour , minute ou second .

    Esta pode ser uma versão um pouco mais limpa, observe também que você deve sempre usar uma raiz ao usar o parseInt.

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

    Consulte a página de análise do MDC para obter mais informações sobre a base.

    O JSLint é uma ótima ferramenta para capturar coisas como um radix ausente e muitas outras coisas que podem causar erros obscuros e difíceis de depurar. Isso força você a usar melhores padrões de codificação para evitar futuras dores de cabeça. Eu uso em todos os projetos JavaScript que eu codifico.

    Basta comparar usando .toDateString como abaixo:

     new Date().toDateString(); 

    Isso retornará apenas a parte da data e não o horário ou o fuso horário, como este:

    “Sex fev 03 2017”

    Portanto, ambas as datas podem ser comparadas neste formato, da mesma forma sem parte do tempo.

    A biblioteca date.js é útil para essas coisas. Ele torna muito mais fácil a tarefa relacionada a datas de JS.

    É assim que eu faço:

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

    Como não vejo aqui abordagem semelhante, e não estou gostando de definir h / m / s / ms como 0, pois pode causar problemas com a transição precisa para o fuso horário local com object de date alterada (presumo que sim), let me apresentar aqui isso, escrito há alguns instantes, function lil:

    + : Fácil de usar, faz uma comparação básica de operações (comparando dia, mês e ano sem tempo).
    - : Parece que isso é um completo oposto do pensamento “fora da checkbox”.

     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 verificação de igualdade,
    datecompare(date1, '>', date2) para maior verificação,
    !datecompare(date1, '>', date2) para uma verificação menor ou igual

    Além disso, obviamente, você pode alternar date1 e date2 em locais para obter qualquer outra comparação simples.

    Certifique-se de construir userDate com um ano de 4 dígitos como setFullYear(10, ...) !== setFullYear(2010, ...) .

    Depois de ler esta pergunta ao mesmo tempo depois que ela é postada, decidi postar outra solução, já que não achei muito satisfatório, pelo menos para as minhas necessidades:

    Eu usei algo assim:

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

    Dessa forma, eu poderia ter usado as datas no formato que queria para o processamento posterior. Mas isso foi apenas para minha necessidade, mas eu decidi postar de qualquer maneira, talvez ajude alguém

    Você pode usar alguma aritmética com o 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; 

    Eu gosto disso porque nenhuma atualização para as datas originais é feita e executada mais rapidamente do que a divisão de string e comparação.

    Espero que esta ajuda!

    Uma maneira eficiente e correta de comparar datas é:

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

    Ele ignora a parte do tempo, funciona para diferentes fusos horários, e você pode comparar a igualdade == também. 86400000 é o número de milissegundos em um dia ( = 24*60*60*1000 ).

    Tenha em atenção que o operador de igualdade == nunca deve ser utilizado para comparar objectos Date porque falha quando espera que um teste de igualdade funcione porque está a comparar dois objectos Date (e não compara as duas datas), por exemplo:

     > 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: Se você estiver comparando objects Date com a parte de tempo definida como zero, você poderá usar date1.getTime() == date2.getTime() mas dificilmente vale a otimização. Você pode usar < , > , <= ou >= ao comparar objects Date diretamente porque esses operadores convertem primeiro o object Date chamando .valueOf() antes que o operador faça a comparação.

    Eu sei que esta pergunta já foi respondida e isso pode não ser o melhor caminho, mas no meu cenário está funcionando perfeitamente, então eu pensei que poderia ajudar alguém como eu.

    se você tiver uma date string como

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

    e você só quer comparar a parte da data com outro object Date em JS,

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

    então você tem que convert a string para o object Date usando a new Date("2018-01-01T18:19:12.543");

    e aqui está o truque:

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

    Eu usei toDateString() do Date object do JS, que retorna apenas a string Date.

    Nota: Não se esqueça de usar a function .valueOf() ao comparar as datas.

    mais informações sobre .valeOf() é aqui referência

    Codding feliz.

    Isso vai ajudar. Eu consegui fazer assim.

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