Comptez les jours jusqu’à aujourd’hui

J’ai une fonction qui obtient le nombre de jours jusqu’à aujourd’hui. Cela fonctionne cependant, j’utilise moment.js pour écrire et formater la date à partir de données JSON et je pense que cela provoque un conflit. Y a-t-il un moyen de faire la même chose en utilisant moment.js?

C’est le JavaScript de travail: http://jsfiddle.net/infatti/XeqPT/

// Count days due function daysUntil(year, month, day) { var now = new Date(), dateEnd = new Date(year, month - 1, day), // months are zero-based days = (dateEnd - now) / 1000/60/60/24; // convert milliseconds to days return Math.round(days); } 

Comment faire la même chose avec moment.js?


Si cela vous intéresse, voici comment j’inscris la date où cela ne fonctionne pas.

  ko.bindingHandlers.textualDate = { update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { var valueUnwrapped = ko.utils.unwrapObservable(valueAccessor()); var textContent = moment(valueUnwrapped).format("MM/DD/YYYY"); ko.bindingHandlers.text.update(element, function () { return textContent; }); } }; 

Si le problème que vous rencontrez est d’utiliser moment.js pour obtenir la durée entre deux dates, vous pouvez utiliser la fonction diff comme ceci:

 var a = moment([2007, 0, 29]); var b = moment([2007, 0, 28]); var diffInMs = a.diff(b); // 86400000 milliseconds var diffInDays = a.diff(b, 'days'); // 1 day 

Maintenant, je ne sais pas si vous avez un problème avec KnockoutJS, mais cela devrait vous assurer que votre calcul est terminé avec moment.js .

Juste pour votre intérêt, je me suis créé un gestionnaire de liaisons personnalisé pour afficher une date de moment il y a quelque temps. La différence avec le tien est que mon observable était déjà un object momentané. Donc, je l’ai modifié ici pour le faire fonctionner avec des objects de date standard:

  ko.bindingHandlers.moment = { update: function(element, valueAccessor) { var value = valueAccessor(); var formattedValue = moment(ko.utils.unwrapObservable(value)).format('MM/DD/YYYY'); $(element).text(formattedValue); } }; 

Edit: Je t’ai fait sortingpoter l’exemple.

Fonctionne pour moi – voir ce violon – http://jsfiddle.net/tlarson/sBMTn/5 . Cela pourrait être utile si vous pouviez nous montrer où se trouvait le problème, afin que nous puissions voir ce qui se passe.

Voici le code que j’ai ajouté:

 var viewModel = { firstDate: ko.observable("2013-7-1"), secondDate: ko.observable("2013-9-1") }; ko.applyBindings(viewModel); 

Et j’ai mis à jour votre balisage pour utiliser le viewmodel:

 
  • Due in days

  • Due in days

Notez que votre appel à each méthode de jQuery ne peut agir que sur des données déjà présentes dans le DOM. Donc, assurez-vous de le mettre après avoir appelé ko.applyBindings

Toutefois…

Vous pouvez envisager d’utiliser un calcul plutôt que d’utiliser jQuery pour la partie “Échéance dans X jours” de la page. Voici comment vous pouvez faire cela: http://jsfiddle.net/tlarson/sBMTn/1