web-dev-qa-db-fra.com

Moment js date date comparaison

J'utilise moment.js pour formater ma date et l'heure. Ici, j'ai deux valeurs de date et je souhaite obtenir une fonction particulière lorsqu'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à.

Ceci est 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-à-dire 2014-03-24T01:15:000 > 2014-03-24T01:14:000, en m'attendant à ce que la première soit plus grande que la seconde, mais elle passe toujours à la condition else. Je ne sais pas pourquoi?

319
Dibish

Je crois que vous recherchez les fonctions de requête , isBefore, isSame et isAfter.

Mais il 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 tel est le cas, considérons le 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'
    

    Cela ne va pas au travail. Je pense que tu voulais 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') de manière incorrecte. .tz appartient à moment-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 au format 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. Le fait que la valeur d’entrée soit en UTC ne signifie pas que vous devez travailler en UTC dans l’ensemble de votre fonction.

  • Vous semblez obtenir le "maintenant" instance par moment(new Date()). Vous pouvez simplement utiliser moment().

Mis à jour

Sur la base de votre modification, 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 format correct:

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');
463
Matt Johnson-Pint

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
}
$(document).ready(function() {
  
  $('.compare').click(function(e) {
  
    var date = $('#date').val();
  
    var now = moment();
    var then = moment(date);
  
    if (now > then) {
      $('.result').text('Date is past');
    } else {
      $('.result').text('Date is future');
    }

  });

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.3/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>



<input type="text" name="date" id="date" value="2014-12-18"  placeholder="yyyy-mm-dd">
<button class="compare">Compare date to current date</button>
<br>
<div class="result"></div>
196
ryanwinchester

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érieure à dateTimeB.

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

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

19
Razan Paul

Il est important que votre date-heure soit au bon format ISO lorsque vous utilisez l'un des éléments momentjs requêtes : isBefore , isAfter , isSameOrBefore , isSameOrAfter , isBetween

Ainsi, au lieu de 2014-03-24T01: 14: 000, votre date/heure doit être soit:

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

sinon, vous risquez de recevoir l'avertissement de dépréciation suivant et la condition sera évaluée à false:

Avertissement de déprécation: la valeur fournie n’est pas au format reconnu RFC2822 ou ISO. La construction de moment revient à js Date (), qui n'est pas fiable sur tous les navigateurs et toutes les versions. Les formats de date non RFC2822/ISO sont déconseillés et seront supprimés dans une prochaine version majeure. Veuillez vous référer à 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>
14
JSON C11

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

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

Je dois le faire dans mon cas, lorsque l'utilisateur ouvre une offre à partir de l'historique des transactions si la date de début de l'offre est inférieure à la date du jour. J'avais besoin d'afficher la date du jour comme date de début.

var startDate = "20/05/2018";

var date1 = moment().format("YYYY-MM-DD");
var date2 = moment(startDate).format("YYYY-MM-DD");

// and i checked with if statement 

if(date1 >  date2){   // if startDate is less than today
   startDate = date1;
}else{ // if startDate is greater than today

}

REMARQUE: pour moi, il fallait convertir les deux dates au même format et utiliser "AAAA-MM-JJ".

7
KATJ Srinath
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 {

}
2
TV-C-15
        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;
        }
0
isaac