Считайте дни до сегодняшнего дня moment.js
У меня есть функция, которая получает количество дней до сегодняшнего дня. Он работает, однако, я использую moment.js для записи и форматирования даты из данных JSON, и я думаю, что это вызывает конфликт. Есть ли способ сделать то же самое, используя moment.js?
Это рабочий JavaScript: 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);
}
Как можно сделать то же самое, используя moment.js?
Если это интересно, вот как я нажимаю дату, когда она не работает.
<span class="due-date" data-bind="textualDate: DueDate"></span>
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; });
}
};
Ответы
Ответ 1
Если проблема заключается в том, чтобы использовать time.js для получения продолжительности между двумя датами, вы можете использовать функцию diff например:
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
Теперь я не знаю, есть ли у вас проблемы с KnockoutJS, но это должно гарантировать, что ваши вычисления будут выполнены с помощью момента .js.
Просто для вашего интереса, я сделал себе специальный обработчик привязки для отображения момента времени некоторое время назад. Разница с твоей заключается в том, что мой наблюдаемый был уже мгновенным объектом. Итак, я изменил его здесь, чтобы он работал со стандартными объектами даты:
ko.bindingHandlers.moment = {
update: function(element, valueAccessor) {
var value = valueAccessor();
var formattedValue = moment(ko.utils.unwrapObservable(value)).format('MM/DD/YYYY');
$(element).text(formattedValue);
}
};
Изменить: я сделал вам fiddle с примером.
Ответ 2
Работает для меня - см. эту скрипку - http://jsfiddle.net/tlarson/sBMTn/5. Было бы полезно, если бы вы могли показать нам скрипку, где проблема существует, чтобы мы могли видеть, что происходит.
Вот код, который я добавил:
var viewModel = {
firstDate: ko.observable("2013-7-1"),
secondDate: ko.observable("2013-9-1")
};
ko.applyBindings(viewModel);
И я обновил вашу разметку, чтобы использовать viewmodel:
<div id="paging1">
<ul class="list paging-items">
<li><!-- item -->
<h4>Due in <span class="days-due"></span> days</h4>
<h4><span data-bind="textualDate: firstDate" class="due-date"></span></h4>
</li><!-- #item -->
<li><!-- item -->
<h4>Due in <span class="days-due"></span> days</h4>
<h4><span data-bind="textualDate: secondDate" class="due-date"></span></h4>
</li><!-- #item -->
</ul>
</div>
Обратите внимание, что ваш вызов метода jQuery each
может действовать только на данные, которые уже находятся в DOM. Поэтому не забудьте поставить его после вызова ko.applyBindings
Однако...
Возможно, вам захочется использовать вычисляемый, а не использовать jQuery для части "Due in X days". Вот как вы могли это сделать: http://jsfiddle.net/tlarson/sBMTn/1