2013-05-07 23 views
20

Bugüne kadar gün sayısını alan bir işlev var. Ancak, JSON verilerinin tarihini yazmak ve biçimlendirmek için moment.js kullanıyorum ve bunun bir çakışma oluşturduğunu düşünüyorum. Moment.js'yi kullanarak aynı şeyi yapmanın bir yolu var mı? http://jsfiddle.net/infatti/XeqPT/Gün sayımı bugüne kadar moment.js

// 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); 
} 

Nasıl aynı şey yapılabilir kullanarak moment.js:

Bu çalışma JavaScript'tir?


Eğer ilgilenmediyse, iş görmediği tarihte nasıl çekiyorum. Sahip olduğunuz sorun iki tarih arasındaki süreyi almak içinmoment.js kullanmak ise

<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

* "Tarihi JSON verilerinden yazmak ve biçimlendirmek için moment.js kullanıyorum ve bunun bir çakışma olduğunu düşünüyorum." * Neden böyle düşünüyorsunuz? Tarihin hesaplanması ve çıktısı tamamen ilgisiz işlemlerdir. –

+0

@ alex23 Tarih kitaplığı kullanmanın birçok nedeni vardır. Tarih/saat matematik çirkin ve kenar durumlarla dolu (değişken ay uzunlukları, saat dilimleri, gün ışığından yararlanma, sıçrama yılları). –

+0

Tarihi html'ye el ile yerleştirdiğimde, çalışır. Bunu html'ye veri bağladığımda, çalışmaz. – simple

cevap

34

, o zaman böyle diff işlevi kullanabilirsiniz: Şimdi

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 

, I don' KnockoutJS ile ilgili herhangi bir sorun yaşarsanız bunu bilmeniz gerekir, ancak bu sizin hesaplamalarınızın moment.js ile yapıldığından emin olmalıdır.

Sadece ilginiz için, bir süre önce bir anı görüntülemek için kendime özel bir bağlayıcı işleyici yaptım. Seninkiyle olan fark, benim gözlemlenebilirliğimin zaten bir an nesnesiydi. Yani, Ben burayı modifiye ettik standart tarih nesnelerle çalışması için:

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: Ben örnekle size fiddle yaptı.

1

Benim için çalışır - şu fiddle'e bakın - http://jsfiddle.net/tlarson/sBMTn/5. Sorunun olduğu bir keman gösterebilirseniz, neler olduğunu görebilmemiz size yardımcı olabilir. İşte

ekledim kodu:

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

Ve ViewModel faydalanmak için işaretlemenizi güncelleme:

<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> 

Not jQuery'nin each yönteminden otomatik arama yalnızca verileri temel alarak hareket edebilir Bu zaten DOM’de. Yani

Bir bilgisayarlı kullanarak yerine sayfanın 'Due X gün bölümü için jQuery kullanarak düşünebilirsiniz ... Eğer Ancak ko.applyBindings

diyoruz sonra koymak emin olun. Bunu nasıl yapabilirdiniz: http://jsfiddle.net/tlarson/sBMTn/1