2013-05-07 14 views
20

Mam funkcję, która dostaje liczbę dni do dzisiaj. Działa jednak, używam pliku .j.js, aby napisać i sformatować datę z danych JSON i myślę, że powoduje to konflikt. Czy jest jakiś sposób na zrobienie tego samego przy użyciu pliku moment.js?Policz dni do dziś moment.js

To JavaScript pracy: 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); 
} 

W jaki sposób można to samo zrobić za pomocą moment.js?


Jeśli jesteś zainteresowany, oto jak wyciągam datę, kiedy to nie działa.

<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

* "Używam pliku .j.jpg do pisania i formatowania daty z danych JSON i myślę, że powoduje to konflikt." * Dlaczego tak uważasz? Obliczanie daty i wyprowadzanie jej to całkowicie niepowiązane operacje. –

+0

@ alex23 Istnieje wiele powodów, dla których warto skorzystać z biblioteki daty. Matematyka daty i czasu jest brzydka i pełna przypadków skrajnych (zmienne długości miesięcy, strefy czasowe, oszczędność czasu letniego, lata przestępne). –

+0

Po ręcznym umieszczeniu daty w html działa. Kiedy dane wiążę je do html, to nie działa. – simple

Odpowiedz

34

Jeśli problem masz jest użycie moment.js aby czas pomiędzy dwiema datami, można użyć funkcji diff takiego:

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 

Teraz, I don” t jeśli masz jakiś problem z KnockoutJS, ale to powinno zapewnić, że twoje obliczenia są wykonane z moment.js.

Po prostu dla twojego interesu, zrobiłem sobie niestandardowy nośnik do wyświetlania daty chwili jakiś czas temu. Różnica z twoją jest taka, że ​​moje obserwowalne było już przedmiotem chwili. Tak, mam zmodyfikowano go tutaj, aby pracować ze standardowymi aktualnych obiektów:

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: zrobiłem wam fiddle z przykładu.

1

Działa dla mnie - zobacz ten skrzypek - http://jsfiddle.net/tlarson/sBMTn/5. Pomocne może okazać się pokazanie nam skrzypiec, w którym występuje problem, abyśmy mogli zobaczyć, co się dzieje.

Oto kod I dodaje:

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

I aktualizowany znaczników skorzystać z 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> 

pamiętać, że wezwanie do each metody jQuery może działać tylko na danych który jest już w DOM. Więc należy go umieścić po wywołaniu ko.applyBindings

Jednak ...

może warto rozważyć przy użyciu komputerowej zamiast przy użyciu jQuery dla części do "związku w X dni strony. Oto, jak możesz to zrobić: http://jsfiddle.net/tlarson/sBMTn/1