Moment js date comparaison de temps

384

J'utilise moment.js pour formater ma date et heure, ici j'ai deux valeurs de date, et je veux réaliser une fonction particulière quand une date est supérieure à l'autre. J'ai lu la plupart de leurs documents, mais je n'ai pas trouvé la fonction pour y parvenir. Je sais que ce sera là.

Voici mon code:

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 {

}

Éditer

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

Ici, je compare deux dates, c'est-à 2014-03-24T01:15:000 > 2014-03-24T01:14:000- dire que je m'attends à ce que la première soit supérieure à la seconde, mais elle passe toujours à la condition else. Je ne sais pas pourquoi?

Dibish
la source

Réponses:

540

Je crois que vous êtes à la recherche pour les fonctions de requête , isBefore, isSame, et isAfter.

Mais c'est un peu difficile de dire exactement ce que vous essayez. Peut-être cherchez-vous simplement à faire la différence entre l'heure d'entrée et l'heure actuelle? Si oui, envisagez la fonction de différence , diff. Par exemple:

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

Quelques autres choses:

  • Il y a une erreur dans la première ligne:

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

    Ça ne va pas marcher. Je pense que vous vouliez dire:

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

    Bien sûr, vous pourriez aussi bien:

    var date_time = '2013-03-24T10:15:20:12Z';
  • Vous utilisez: .tz('UTC')incorrectement. .tzappartient au fuseau horaire . Vous n'avez pas besoin de l'utiliser sauf si vous travaillez avec d'autres fuseaux horaires, comme America/Los_Angeles.

    Si vous souhaitez analyser une valeur en UTC, utilisez:

    moment.utc(theStringToParse)

    Ou, si vous souhaitez analyser une valeur locale et la convertir en UTC, utilisez:

    moment(theStringToParse).utc()

    Ou peut-être n'en avez-vous pas besoin du tout. Ce n'est pas parce que la valeur d'entrée est en UTC que vous devez travailler en UTC tout au long de votre fonction.

  • Vous semblez obtenir l'instance "maintenant" moment(new Date()). Vous pouvez simplement utiliser à la place moment().

Mise à jour

Sur la base de votre montage, je pense que vous pouvez simplement faire ceci:

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

Ou, si vous souhaitez vous assurer que vos champs sont validés pour être au bon format:

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
la source
1
Merci pour vos précieux commentaires. J'ai modifié mon code pour inclure vos commentaires, mais je n'ai pas fait la différence correctement. Pouvez-vous s'il vous plaît vérifier mon code modifié
Dibish
3
Voir la réponse mise à jour. Regardez également le nombre de chiffres dans le champ des secondes. Et est- req.body.timezonece autre chose que Z? Si oui, quoi?
Matt Johnson-Pint
Merci beaucoup pour votre code édité, j'y suis presque arrivé. Dans mon cas, j'ai ce numéro de fuseau horaire du côté utilisateur, par exemple date_time = 2014-03-25T23: 10 + 5: 30, lorsque j'utilise moment (date_time) .utc () quelque temps j'ai eu une date invalide
Dibish
1
Quand je mets +05: 30, cela fonctionne très bien. Encore une fois merci beaucoup pour votre gentillesse
Dibish
.isSame () est exactement ce que je cherchais. D'une manière ou d'une autre, il l'avait manqué dans les documents.
Will Strohl
232

Vous devriez pouvoir les comparer directement.

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

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

ryanwinchester
la source
88
Je pense qu'il vaut la peine d'expliquer que cela fonctionne parce que javascript contraint les objets aux primitives via Object.prototype.valueOflesquelles est remplacé dans le prototype du moment pour renvoyer un horodatage d'époque sous forme de nombre. C'est donc similaire à now.format('x') > date.format('x').
tandrewnichols
non ça ne marche pas ... voici ce que j'ai essayé. // newDate est supérieur à la date actuelle ... donc il imprime échoue à la fois dans des conditions plus grandes et moins const constDate = res.url.expiryDate; const newDate = moment (resDate); var now = moment (). format ("JJ / MM / AAAA"); if (now <newDate) {console.log ("success"); } else {console.log ("fail")}
steve
3
@steve moment().format("DD/MM/YYYY")renverra une chaîne, puis vous comparez par ordre alphabétique, puis le 1er décembre viendrait avant le 2 janvier, car vous menez également avec les jours. Ne l'utilisez pas format()si vous souhaitez comparer directement les objets du moment.
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"));

La méthode renvoie 1 si dateTimeA est supérieur à dateTimeB

La méthode renvoie 0 si dateTimeA est égal à dateTimeB

La méthode renvoie -1 si dateTimeA est inférieure à dateTimeB

Razan Paul
la source
1
fonction compare1 (dateTimeA, dateTimeB) {moment de retour (dateTimeA, 'MM / DD / YYYY'). diff (dateTimeB, 'MM / DD / YYYY'); }
Shamseer
23

Il est important que votre datetime est dans le bon format ISO lorsque vous utilisez l' une des requêtes momentjs : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

Ainsi, au lieu de 2014-03-24T01: 14: 000, votre datetime devrait être soit:

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

sinon, vous pouvez recevoir l'avertissement de dépréciation suivant et la condition sera évaluée comme fausse:

Avertissement de dépréciation: la valeur fournie n'est pas dans un format RFC2822 ou ISO reconnu. la construction du moment revient à js Date (), qui n'est pas fiable sur tous les navigateurs et versions. Les formats de date non RFC2822 / ISO sont déconseillés et seront supprimés dans une prochaine version majeure. Veuillez consulter http://momentjs.com/guides/#/warnings/js-date/ pour plus d'informations.

// 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
la source
10

passer la date à un moment comme celui-ci, il comparera et donnera un résultat. si vous ne voulez pas de format, supprimez-le

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")
vijay kumar
la source
6
Be carefulce n'est rien d'autre que de comparer deux cordes
Pranoy Sarkar
@PranoySarkar pouvez-vous s'il vous plaît me dire pourquoi nous devons être plus prudents?
DEEPESH KUMAR R
6
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
la source
2

pour la comparaison date-heure, vous pouvez utiliser la valueOffonction du moment qui fournit les millisecondes de la date-heure, ce qui est préférable pour la comparaison:

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
la source
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
la source