O que há de errado com o código abaixo?
Talvez fosse mais simples comparar a data e não a hora. Também não sei como fazer isso e procurei, mas não consegui encontrar o meu problema exato.
Aliás, quando eu mostro as duas datas em um alerta, elas são exatamente iguais.
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 incluir a hora?
fonte
date1 === date2
não parece fornecer um comportamento consistente; é melhor fazerdate1.valueOf() === b.valueOf()
ou até mesmodate1.getTime() === date2.getTime()
. Estranho.var date2 = new Date(2011,8,20)
. Agora altere o fuso horário do sistema operacional para Horário do Pacífico (EUA). No mesmo console do navegador, digitedate2.toDateString()
e você voltaráMon Sep 19 2011
em vez da terça-feira, dia 20!setHours()
define o tempo com base no fuso horário atual, detectado automaticamente pelo navegador. Tente:t = new Date("2016-02-29T01:45:49.098Z");
t.setHours(0,0,0,0);
console.log(t.toJSON());
será impresso"2016-02-28T15:00:00.000Z"
, data 28, mas não 29 Meu fuso horário atual éAsia/Tokyo
setUTCxxx
métodos em vez das variantes com reconhecimento de fuso horário / local.Cuidado com o fuso horário
O uso do objeto date para representar imediatamente uma data leva a um enorme problema de excesso de precisão. Você precisa gerenciar o tempo e o fuso horário para mantê-los fora, e eles podem voltar a qualquer momento. A resposta aceita para essa pergunta cai na armadilha.
Uma data javascript não tem noção de fuso horário . É um momento no tempo (ticks desde a época) com funções práticas (estáticas) para traduzir de e para strings, usando por padrão o fuso horário "local" do dispositivo ou, se especificado, UTC ou outro fuso horário. Para representar just-a-date ™ com um objeto de data, você deseja que suas datas representem o UTC à meia-noite no início da data em questão. Essa é uma convenção comum e necessária que permite trabalhar com datas, independentemente da estação ou do fuso horário de sua criação. Portanto, você precisa estar muito vigilante para gerenciar a noção de fuso horário, tanto ao criar seu objeto UTC Date da meia-noite quanto ao serializá-lo.
Muitas pessoas ficam confusas com o comportamento padrão do console. Se você pulverizar uma data no console, a saída exibida incluirá seu fuso horário. Isso ocorre apenas porque o console chama
toString()
sua data etoString()
fornece uma representação local. A data subjacente não possui fuso horário ! (Enquanto a hora corresponder ao deslocamento do fuso horário, você ainda terá um objeto de data UTC da meia-noite)Desserializando (ou criando objetos UTC Date da meia-noite)
Este é o passo de arredondamento, com o truque de que existem duas respostas "certas". Na maioria das vezes, você deseja que sua data reflita o fuso horário do usuário. Clique se hoje é seu aniversário . Os usuários da Nova Zelândia e EUA clicam ao mesmo tempo e obtêm datas diferentes. Nesse caso, faça isso ...
Às vezes, a comparabilidade internacional supera a precisão local. Nesse caso, faça isso ...
Desserializar uma data
Frequentemente, as datas na transmissão estão no formato AAAA-MM-DD. Para desserializá-los, faça isso ...
Serialização
Tendo tomado o cuidado de gerenciar o fuso horário ao criar, agora é necessário manter o fuso horário ao converter novamente em uma representação de sequência. 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 o mais, especialmente ...
getYear()
,getMonth()
,getDate()
Então, para responder sua pergunta, 7 anos tarde demais ...
Veja em execução ...
Atualização 2019 ... coisas grátis ...
Dada a popularidade desta resposta, coloquei tudo em código. A função a seguir retorna um objeto de data agrupada e expõe apenas as funções seguras para uso com o just-a-date ™.
Chame-o com um objeto Date e ele resolverá o JustADate refletindo o fuso horário do usuário. Chame-o com uma sequência: se a sequência for uma ISO 8601 com o fuso horário especificado, concluiremos a parte do tempo. Se o fuso horário não for especificado, nós o converteremos em uma data que reflita o fuso horário local, assim como nos objetos de data.
fonte
Que tal agora?
Permite comparar a parte da data dessa data sem afetar o valor da sua variável:
fonte
Usando Moment.js
Se você tem a opção de incluir uma biblioteca de terceiros, definitivamente vale a pena dar uma olhada no Moment.js . Isso facilita o trabalho
Date
eDateTime
muito, muito mais.Por exemplo, vendo se uma Data vem após outra Data, mas excluindo o horário, você faria algo assim:
O segundo parâmetro que você passar para
isAfter
é a precisão para fazer a comparação e pode ser qualquer umyear
,month
,week
,day
,hour
,minute
ousecond
.fonte
Basta comparar usando .toDateString como abaixo:
Isso fará com que você retorne apenas a parte da data e não a hora ou o fuso horário, assim:
Portanto, ambas as datas podem ser comparadas nesse formato da mesma forma, sem parte do tempo.
fonte
new Date(new Date().toDateString());
Essa pode ser uma versão um pouco mais limpa, observe também que você sempre deve usar um radix ao usar o parseInt.
Confira a página MDC parseInt para obter mais informações sobre o radix.
O JSLint é uma ótima ferramenta para capturar coisas como um radical ausente e muitas outras coisas que podem causar erros obscuros e difíceis de depurar. Obriga você a usar melhores padrões de codificação para evitar futuras dores de cabeça. Eu o uso em todos os projetos JavaScript que eu codifico.
fonte
A biblioteca date.js. é útil para essas coisas. Isso facilita muito todos os scripts relacionados à data do JS.
fonte
Se você estiver realmente comparando a data apenas com nenhum componente de hora, outra solução que pode parecer errada, mas funciona e evita todas as
Date()
dores de cabeça de fuso horário e tempo é comparar a data da string ISO diretamente usando a comparação de string:Você pode obter a data atual (data UTC, não necessariamente a data local do usuário) usando:
Meu argumento a favor é a simplicidade do programador - é muito menos provável que você estrague isso do que tentar manipular datas e compensações corretamente, provavelmente ao custo da velocidade (não comparei o desempenho)
fonte
new Date().toISOString().substr(0, 10) // "2019-04-22"
.new Date().toLocaleDateString() // "8/26/2019"
. Mas comparar o texto não será preciso (como"8/26/2019" >= "9/29/2001"
é falso). Portanto, você precisará convertê-lonew Date(new Date().toLocaleDateString())
para comparar com precisão com outra Data.Basta usar toDateString () nas duas datas. toDateString não inclui a hora; portanto, por 2 vezes na mesma data, os valores serão iguais, conforme demonstrado abaixo.
Obviamente, algumas das preocupações de fuso horário expressas em outras partes desta questão são válidas, mas em muitos cenários, essas não são relevantes.
fonte
É assim que eu faço:
fonte
getTime()
é necessário?setHours()
modifica o objeto em que é chamado e retorna a data como um número de milissegundos (equivalente a chamadagetTime()
). Portanto, suatoday
variável não é umDate
objeto como alguns esperariam, mas na verdade é um número inteiro de milissegundos. Como efeito colateral, é por isso que você não precisou ligargetTime()
antes da comparação, pois já o possui de maneira obscura.Como não vejo aqui uma abordagem semelhante e não estou gostando de definir h / m / s / ms como 0, pois isso pode causar problemas com a transição precisa para o fuso horário local com o
date
objeto alterado (presumo que sim), deixe-me introduza aqui isso, escrito alguns momentos atrás, função lil:+
: Fácil de usar, realiza operações básicas de comparação (comparando dia, mês e ano sem tempo.)-
: Parece que esse é o oposto completo do pensamento "pronto para uso".Uso:
datecompare(date1, '===', date2)
para verificação de igualdade,datecompare(date1, '>', date2)
para verificação maior,!datecompare(date1, '>', date2)
para verificação menor ou igualAlém disso, obviamente, você pode alternar
date1
edate2
em lugares para conseguir qualquer outra comparação simples.fonte
Uma maneira eficiente e correta de comparar datas é:
Ele ignora a parte do tempo, funciona para diferentes fusos horários e você também pode comparar a igualdade
==
. 86400000 é o número de milissegundos em um dia (= 24*60*60*1000
).Cuidado: o operador de igualdade nunca
==
deve ser usado para comparar objetos Date, porque falha quando você espera que um teste de igualdade funcione porque ele está comparando dois objetos Date (e não compara as duas datas), por exemplo:Notas: Se você estiver comparando objetos Date com a parte da hora definida como zero, poderá usar,
date1.getTime() == date2.getTime()
mas dificilmente vale a pena a otimização. Você pode usar<
,>
,<=
, ou>=
quando se comparam Data objetos diretamente porque esses operadores primeiro converter o objeto Data chamando.valueOf()
antes que o operador faz a comparação.fonte
Depois de ler esta pergunta no mesmo período após a publicação, decidi postar outra solução, pois não a achei satisfatória, pelo menos para as minhas necessidades:
Eu usei algo como isto:
Dessa forma, eu poderia ter usado as datas no formato que desejava para processar posteriormente. Mas isso foi apenas para minha necessidade, mas eu decidi publicá-lo de qualquer maneira, talvez isso ajude alguém
fonte
currentDate
variável não é uma data, é um número de milissegundos desde 01-01-19 1970. OsetHours()
método modifica o objeto de data em que é chamado e retorna o equivalente agetTime()
(valor da data em milissegundos desde 01-01 1970).Certifique-se de construir
userDate
com um ano de 4 dígitos comosetFullYear(10, ...) !== setFullYear(2010, ...)
.fonte
Você pode usar aritmética com o total de ms.
Eu gosto disso porque nenhuma atualização nas datas originais é feita e é realizada mais rapidamente do que a divisão e a comparação de strings.
Espero que esta ajuda!
fonte
Esse JS mudará o conteúdo após a data definida, aqui está a mesma coisa, mas no w3schools
fonte
Isso funciona para mim:
Na resposta aceita, há um problema de fuso horário e no outro horário não é 00:00:00
fonte
Sei que esta pergunta já foi respondida e talvez essa não seja a melhor maneira, mas no meu cenário está funcionando perfeitamente, então pensei que poderia ajudar alguém como eu.
se você tem
date string
comoe você só deseja comparar a parte da data com outro objeto Date em JS,
então você tem que
convert
ostring
deDate
objeto usandonew Date("2018-01-01T18:19:12.543");
e aqui está o truque: -
Eu usei
toDateString()
deDate object
JS, que retorna apenas a string Date.Nota: Não se esqueça de usar o
.valueOf()
função ao comparar as datas.mais informações sobre
.valeOf()
aqui é referênciaFeliz codificação.
fonte
Isso vai ajudar. Eu consegui fazer assim.
fonte
Comparando com
setHours()
será uma solução. Amostra:fonte
se seu formato de data for diferente, use moment.js biblioteca para converter o formato da sua data e use o código acima para comparar duas datas
Exemplo:
Se a sua data estiver em "DD / MM / AAAA" e quiser convertê-la em "MM / DD / AAAA", consulte o exemplo de código abaixo
fonte
Você pode usar fp_incr (0). Que define a parte do fuso horário como meia-noite e retorna um objeto de data.
fonte