Confronto ora data js data


384

Sto usando moment.js per formattare la mia data, qui ho due valori di data e voglio ottenere una funzione particolare quando una data è maggiore dell'altra. Ho letto la maggior parte dei loro documenti, ma non ho trovato la funzione per raggiungere questo obiettivo. So che ci sarà.

Questo è il mio codice:

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 {

}

modificare

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

Qui, sto confrontando due date 2014-03-24T01:15:000 > 2014-03-24T01:14:000, cioè mi aspetto che la prima sia maggiore della seconda, ma va sempre alla condizione else. Non so perché?

Risposte:


540

Credo che si sta cercando per le funzioni di query , isBefore, isSame, e isAfter.

Ma è un po 'difficile dire esattamente cosa stai tentando. Forse stai solo cercando di fare la differenza tra l'ora di ingresso e l'ora corrente? Se è così, prendere in considerazione la funzione di differenza , diff. Per esempio:

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

Alcune altre cose:

  • C'è un errore nella prima riga:

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

    Non funzionerà. Penso che volevi dire:

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

    Naturalmente, potresti anche:

    var date_time = '2013-03-24T10:15:20:12Z';
  • Stai usando: in .tz('UTC')modo errato. .tzappartiene al fuso orario momento . Non è necessario utilizzarlo a meno che non si lavori con altri fusi orari, come America/Los_Angeles.

    Se vuoi analizzare un valore come UTC, usa:

    moment.utc(theStringToParse)

    Oppure, se si desidera analizzare un valore locale e convertirlo in UTC, utilizzare quindi:

    moment(theStringToParse).utc()

    O forse non ti serve affatto. Solo perché il valore di input è in UTC, non significa che devi lavorare in UTC per tutta la tua funzione.

  • Sembra che tu stia ottenendo l'istanza "now" di moment(new Date()). Puoi invece semplicemente usare moment().

aggiornato

Sulla base della tua modifica, penso che puoi semplicemente fare questo:

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

Oppure, se desideri assicurarti che i tuoi campi siano convalidati per essere nel formato corretto:

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

1
Grazie per i tuoi preziosi commenti. Ho modificato il mio codice per includere i tuoi commenti ma non ottenere la differenza correttamente. Potete per favore controllare il mio codice modificato
Dibish

3
Vedi la risposta aggiornata. Guarda anche il numero di cifre nel campo dei secondi. E c'è req.body.timezonemai qualcosa di diverso da Z? E allora?
Matt Johnson-Pint,

Grazie mille per il tuo codice modificato, ci sono quasi arrivato .. Nel mio caso ho quel numero di fuso orario dal lato utente ad es. Date_time = 2014-03-25T23: 10 + 5: 30, quando uso il momento (date_time) .utc () qualche volta ho avuto la data non valida
Dibish

1
Quando ho messo +05: 30 funziona benissimo. Ancora una volta grazie mille per la tua gentilezza
Dibish

.isSame () è esattamente quello che stavo cercando. In qualche modo l'aveva perso nei documenti precedenti.
Will Strohl,

231

Dovresti essere in grado di confrontarli direttamente.

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

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


88
Sento che vale la pena spiegare che questo funziona perché javascript costringe gli oggetti a primitivi tramite i Object.prototype.valueOfquali viene sovrascritto nel momento in cui il prototipo restituisce un timestamp di epoca come numero. Quindi questo è simile a now.format('x') > date.format('x').
tandrewnichols,

no non funziona ... ecco cosa ho provato. // newDate è più alto della data odierna ... quindi le stampe falliscono sia in condizioni maggiori che in meno const resDate = res.url.expiryDate; const newDate = moment (resDate); var now = moment (). format ("GG / MM / AAAA"); if (now <newDate) {console.log ("successo"); } else {console.log ("fail")}
steve

3
@steve moment().format("DD/MM/YYYY")restituirà una stringa e poi ti confronterai in ordine alfabetico e poi il 1 ° dicembre arriverà prima del 2 gennaio, perché anche tu sei in testa con i giorni. Non utilizzare format()se si desidera confrontare direttamente gli oggetti del momento.
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"));

Il metodo restituisce 1 se dateTimeA è maggiore di dateTimeB

Il metodo restituisce 0 se dateTimeA è uguale a dateTimeB

Il metodo restituisce -1 se dateTimeA è inferiore a dateTimeB


1
funzione compare1 (dateTimeA, dateTimeB) {momento di ritorno (dateTimeA, 'MM / GG / AAAA'). diff (dateTimeB, 'MM / GG / AAAA'); }
Shamseer,

23

E 'importante che il vostro datetime è nel corretto formato ISO quando si utilizza qualsiasi delle query momentjs : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

Quindi, invece di 2014-03-24T01: 14: 000, il tuo datetime dovrebbe essere:

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

altrimenti potresti ricevere il seguente avviso di deprecazione e la condizione verrà valutata come falsa:

Avviso di deprecazione: il valore fornito non è in un formato RFC2822 o ISO riconosciuto. momento la costruzione ricade su js Date (), che non è affidabile su tutti i browser e le versioni. I formati di data non RFC2822 / ISO sono sconsigliati e verranno rimossi in una versione principale imminente. Per ulteriori informazioni, consultare http://momentjs.com/guides/#/warnings/js-date/ .

// 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>


10

passare la data al momento in questo modo si confronterà e darà risultato. se non si desidera il formato rimuoverlo

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")

6
Be carefulquesto non è altro che confrontare due stringhe
Pranoy Sarkar,

@PranoySarkar, per favore, puoi dirmi perché dobbiamo stare più attenti?
DEEPESH KUMAR R


2

per il confronto data-ora, è possibile utilizzare la valueOffunzione del momento che fornisce millisecondi della data-ora, che è la cosa migliore per il confronto:

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>


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;
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.