Подтвердить что ты не робот

Считайте дни до сегодняшнего дня 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; });
    }
};
4b9b3361

Ответ 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