2013-05-07 105 views
20

我有一個函數,獲取天數,直到今天。但是,它的工作原理是,我使用moment.js從JSON數據中編寫並格式化日期,我認爲這是導致衝突的原因。有沒有辦法使用moment.js做同樣的事情?計算幾天直到今天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

*「我使用的是moment.js來編寫和格式化來自JSON數據的日期,我認爲這是導致衝突。」*你爲什麼這麼認爲?計算日期並輸出它是完全無關的操作。 – 2013-05-07 17:09:05

+0

@ alex23使用日期庫有很多原因。日期/時間的數學是醜陋的,充滿了邊緣情況(可變月份長度,時區,夏令時,閏年)。 – 2013-05-07 17:09:22

+0

當我手動將日期放入html中時,它可以正常工作。當我將數據綁定到html中時,它不起作用。 – simple 2013-05-07 17:12:01

回答

34

如果你有問題是使用moment.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是否有問題,但是這應該確保您的計算是通過moment.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與示例。

1

適用於我 - 看到這個小提琴 - http://jsfiddle.net/tlarson/sBMTn/5。如果您可以向我們展示存在問題的小提琴可能會有所幫助,以便我們可以看到發生了什麼。

這裏是我添加的代碼:

var viewModel = { 
    firstDate: ko.observable("2013-7-1"), 
    secondDate: ko.observable("2013-9-1") 
}; 
ko.applyBindings(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的頁面「由於在X天」的一部分。下面是你如何做到這一點:http://jsfiddle.net/tlarson/sBMTn/1