Comparação da hora do momento do momento js

384

Estou usando moment.js para formatar minha data e hora, aqui tenho dois valores de data e quero atingir uma função específica quando uma data é maior que a outra. Eu li a maioria dos documentos deles, mas não encontrei a função para conseguir isso. Eu sei que estará lá.

Este é o meu código:

var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'
var d = moment(date_time).tz('UTC'); // first date 

var now = new Date(),
    dnow = moment(now).tz('UTC'),
    snow = dnow.minute() % 15,
    diffnow = 15 - snow,
    tonow = moment(dnow).add('minute', diffnow),
    ahead30now = moment(tonow).add('minute', 30);

if (d > ahead30now) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}

Editar

var date_time = req.body.date + 'T' + req.body.time + req.body.timezone; // 2014-03-24T01:15:000
var utc_input_time = moment(date_time).utc(); // 2014-03-24T01:15:000
console.log('utc converted date_time', moment(date_time).utc().format("YYYY-MM-DDTHH:mm:SSS"));
var isafter = moment(utc_input_time).isAfter(moment('2014-03-24T01:14:000')); // true
if(isafter === true){
    console.log('is after true');
} else {
    console.log('is after is false');
}

Aqui, estou comparando duas datas 2014-03-24T01:15:000 > 2014-03-24T01:14:000, ou seja , esperando que a primeira seja maior que a segunda, mas sempre vá para a condição else. Não sei porque?

Dibish
fonte

Respostas:

540

Eu acredito que você está olhando para as funções de consulta , isBefore, isSame, e isAfter.

Mas é um pouco difícil dizer exatamente o que você está tentando. Talvez você esteja apenas procurando a diferença entre o tempo de entrada e o tempo atual? Se assim for, considere a função de diferença , diff. Por exemplo:

moment().diff(date_time, 'minutes')

Algumas outras coisas:

  • Há um erro na primeira linha:

    var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'

    Isso não vai funcionar. Eu acho que você quis dizer:

    var date_time = '2013-03-24' + 'T' + '10:15:20:12' + 'Z';

    Claro, você também pode:

    var date_time = '2013-03-24T10:15:20:12Z';
  • Você está usando: .tz('UTC')incorretamente. .tzpertence ao fuso horário do momento . Você não precisa usar isso, a menos que esteja trabalhando com outros fusos horários, como America/Los_Angeles.

    Se você deseja analisar um valor como UTC, use:

    moment.utc(theStringToParse)

    Ou, se você deseja analisar um valor local e convertê- lo em UTC, use:

    moment(theStringToParse).utc()

    Ou talvez você não precise disso. Só porque o valor de entrada está no UTC, não significa que você precise trabalhar no UTC durante toda a sua função.

  • Você parece estar recebendo a instância "now" por moment(new Date()). Você pode apenas usar moment().

Atualizada

Com base na sua edição, acho que você pode fazer isso:

var date_time = req.body.date + 'T' + req.body.time + 'Z';
var isafter = moment(date_time).isAfter('2014-03-24T01:14:00Z');

Ou, se você deseja garantir que seus campos sejam validados para estar no formato correto:

var m = moment.utc(req.body.date + ' ' + req.body.time, "YYYY-MM-DD  HH:mm:ss");
var isvalid = m.isValid();
var isafter = m.isAfter('2014-03-24T01:14:00Z');
Matt Johnson-Pint
fonte
11
Obrigado por seus valiosos comentários. Editei meu código para incluir seus comentários, mas não percebi a diferença corretamente. U por favor pode verificar meu código editado
Dibish
3
Veja a resposta atualizada. Observe também o número de dígitos no campo de segundos. E há req.body.timezonealgo além disso Z? Se sim, o que?
Matt Johnson-Pint
Muito obrigado pelo seu código editado, eu quase cheguei lá .. No meu caso, eu tenho esse número de fuso horário do lado do usuário, por exemplo, date_time = 2014-03-25T23: 10 + 5: 30, quando uso o momento (date_time) .utc () em algum momento em que recebi uma data inválida
Dibish 25/03
11
Quando eu coloco + 05:30, ele funciona muito bem. Mais uma vez muito obrigado pela sua gentileza
Dibish
.isSame () é exatamente o que eu estava procurando. De alguma forma, perdi isso nos documentos anteriores.
Will Strohl
231

Você deve poder compará-los diretamente.

var date = moment("2013-03-24")
var now = moment();

if (now > date) {
   // date is past
} else {
   // date is future
}

ryanwinchester
fonte
88
Eu acho que vale a pena explicar que isso funciona porque o javascript coage objetos para primitivas por meio das Object.prototype.valueOfquais é substituído no protótipo do momento para retornar um carimbo de data / hora da época como um número. Então, isso é semelhante a now.format('x') > date.format('x').
tandrewnichols
não, não está funcionando ... aqui está o que eu tentei. // newDate é maior que a data de hoje ... portanto, a impressão falha em condições maiores e menores const resDate = res.url.expiryDate; const newDate = momento (resDate); var now = moment (). format ("DD / MM / AAAA"); if (agora <newDate) {console.log ("success"); } else {console.log ("fail")}
steve
3
O @steve moment().format("DD/MM/YYYY")retornará uma string e, em seguida, você estará comparando em ordem alfabética e o 1º de dezembro chegará antes de 2 de janeiro, porque você também lidera com dias. Não use format()se você quiser comparar os momentos diretamente.
Ryanwinchester #
28

Jsfiddle: http://jsfiddle.net/guhokemk/1/

 function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

O método retornará 1 se dateTimeA for maior que dateTimeB

O método retornará 0 se dateTimeA for igual a dateTimeB

O método retornará -1 se dateTimeA for menor que dateTimeB

Razan Paul
fonte
11
função compare1 (dateTimeA, dateTimeB) {momento de retorno (dateTimeA, 'MM / DD / AAAA'). diff (dateTimeB, 'MM / DD / AAAA'); }
Shamseer 21/08/17
23

É importante que a sua data e hora está no correto formato ISO ao usar qualquer um dos consultas momentjs : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

Portanto, em vez de 2014-03-24T01: 14: 000, seu datetime deve ser:

2014-03-24T01: 14: 00 ou 2014-03-24T01: 14: 00.000Z

caso contrário, você poderá receber o seguinte aviso de descontinuação e a condição será avaliada como falsa:

Aviso de descontinuação: o valor fornecido não está no formato RFC2822 ou ISO reconhecido. A construção do momento volta para js Date (), que não é confiável em todos os navegadores e versões. Os formatos de data não RFC2822 / ISO são desencorajados e serão removidos em uma próxima versão principal. Consulte http://momentjs.com/guides/#/warnings/js-date/ para obter mais informações.

// https://momentjs.com/docs/#/query/

const dateIsAfter = moment('2014-03-24T01:15:00.000Z').isAfter(moment('2014-03-24T01:14:00.000Z'));

const dateIsSame = moment('2014-03-24T01:15:00.000Z').isSame(moment('2014-03-24T01:14:00.000Z'));

const dateIsBefore = moment('2014-03-24T01:15:00.000Z').isBefore(moment('2014-03-24T01:14:00.000Z'));

console.log(`Date is After: ${dateIsAfter}`);
console.log(`Date is Same: ${dateIsSame}`);
console.log(`Date is Before: ${dateIsBefore}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"
></script>

JSON C11
fonte
10

passar a data a um momento como este, ele será comparado e dará resultado. se você não quer formato removê-lo

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")
vijay kumar
fonte
6
Be carefulisso não é nada, mas comparando duas cordas
Pranoy Sarkar
@PranoySarkar, pode me dizer por que precisamos ter mais cuidado?
KUMAR PROFUNDO R
5
moment(d).isAfter(ahead30now); // true

http://momentjs.com/docs/#/query/is-after/

if (moment(d).isAfter(ahead30now)) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}
TV-C-15
fonte
2

para comparação de data e hora, você pode usar a valueOffunção do momento que fornece milissegundos da data e hora, o que é melhor para comparação:

let date1 = moment('01-02-2020','DD-MM-YYYY').valueOf()
let date2 = moment('11-11-2012','DD-MM-YYYY').valueOf()

//     alert((date1 > date2 ? 'date1' : 'date2') + " is greater..."  )

if (date1 > date2) {
   alert("date1 is greater..." )
} else {
   alert("date2 is greater..." )
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

Tyagi
fonte
1
        var startDate = moment(startDateVal, "DD.MM.YYYY");//Date format
        var endDate = moment(endDateVal, "DD.MM.YYYY");

        var isAfter = moment(startDate).isAfter(endDate);

        if (isAfter) {
            window.showErrorMessage("Error Message");
            $(elements.endDate).focus();
            return false;
        }
isaac
fonte