2013-03-08 18 views
7

Jestem dość nowy dla angularjs, ale tutaj to idzie. Potrafię dwie daty przez angularjs w postaci dd/mm/yyyy, ale muszę odjąć dwie daty, aby uzyskać różnicę między dniami. Stworzyłem funkcję jquery, aby to zrobić, ale nie wiem, jak przekazać te dwie daty do funkcji. Zastanawiałem się, czy byłby to inny sposób postępowania?Jak odjąć dwie zmienne daty angularjs

Próbuję skonfigurować system wyzwalania w zależności od liczby dni pomiędzy tymi datami, aby niektóre elementy były stylizowane. Na przykład, jeśli jest to w ciągu 10 dni, chcę użyć stylu w stylu 1, a jeśli jest dostępny w ciągu 20 dni, użyj stylu w stylu 2 i tak dalej.

+0

Co robi Twój kod wyglądać? –

+0

Jakieś przemyślenia na temat 2 odpowiedzi? –

Odpowiedz

2

Jestem także nowicjuszem angularjs, ale czy nie poradziłbyś sobie z tym poprzez udostępnienie właściwości za pomocą modelu widoku javascript?

Na przykład pole w stylu zmienia się w zależności od pól daty (np. Styl zwraca styl 1, gdy różnica wynosi 10 dni) i miejmy nadzieję, że poprzez powiązanie angularjs aktualizacje zostaną przeniesione na ekran.

myślę prawo termin ten jest obliczany nieruchomość lub obliczony nieruchomość

EDIT

Nie wiem, czy to jest to, czego szukasz, ale patrz na przykład skrzypce obliczanie różnic daty i zmiana stylu wszystkich opartych na off właściwości modelu widoku (zakres)

scope.diff i scope.col są 2 właściwościami b ind do

http://jsfiddle.net/chrismoutray/wfjv6/

HTML

<script src="http://code.angularjs.org/0.10.4/angular-0.10.4.min.js" ng:autobind></script> 
<div ng:controller="ComputedPropertiesCtrl"> 
    first date <input ng:model="firstdate"> second date <input ng:model="seconddate"> difference {{diff}} 
    <div>when the difference is greater than 10 color changes to green</div> 
    <div>eg set the second date to 15/01/2013</div> 
    <div style="background-color:{{col}};"> State </div> 
</div> 

JS

function ComputedPropertiesCtrl() { 
    var scope = this; 
    scope.firstdate = '01/01/2013'; 
    scope.seconddate = '10/01/2013'; 
    scope.data_before = []; 
    scope.differenceInDays = function() { 

     var dt1 = scope.firstdate.split('/'), 
      dt2 = scope.seconddate.split('/'), 
      one = new Date(dt1[2], dt1[1]-1, dt1[0]), 
      two = new Date(dt2[2], dt2[1]-1, dt2[0]); 

     var millisecondsPerDay = 1000 * 60 * 60 * 24; 
     var millisBetween = two.getTime() - one.getTime(); 
     var days = millisBetween/millisecondsPerDay; 

     return Math.floor(days);  
    }; 
    scope.color = function() { 
     return (scope.differenceInDays() > 10) ? 'green' : 'red'; 
    }; 

    scope.$watch('[firstdate, seconddate]', function(currScope,newVal,oldVal) { 
     scope.data_before = oldVal; 
     scope.diff = scope.differenceInDays(); 
    }); 

    scope.$watch('[firstdate, seconddate]', function(currScope,newVal,oldVal) { 
     scope.data_before = oldVal; 
     scope.col = scope.color(); 
    }); 
} 

CSS

h2 { position: fixed; right: 10px; top: 10px; color: red; background:white;z-index:1000; } 
input { width: 100px; } 
div { margin: 10px; padding: 10px; } 
+0

cóż, domyślam się, że prawdziwym problemem jest jak obliczyć różne w dniach? – user1399078

+0

@ user1399078 zobacz skrzypce i kod dodany - może to pomaga –

+0

@ChrisMoutray, który jest świetnym przykładem, ale jak to zrobić dla każdego elementu w tablicy? – vittore

12

podstawowym sposobem javascript:

var d1 = new Date('01/16/2013'); 
var d2 = new Date('02/26/2013'); 
var milliseconds = d2-d1; 
var seconds = milliseconds/1000; 
var minutes = seconds/60; 
var hours = minutes/60; 
var days = hours/24; 

Używając jednej z bibliotek daty (takie jak moment.js):

var d1 = moment("01/16/2013"); 
var d2 = moment("02/26/2013"); 
var days = moment.duration(d2.diff(d1)).asDays(); 
4

po prostu przekonwertować datę w datownik, a następnie odjąć.

var Date1 = 08/16/2004; 
var Date2= 10/24/2005; 

var timestamp1 = new Date(Date1).getTime(); 
var timestamp2 = new Date(Date2).getTime(); 

var diff = timestamp1 - timestamp2 


var newDate = new Date (diff); 
2

To działa, a oto 2 bezbłędne funkcje daty javascript, które nigdy nie powinny się obejść ...

// Returns the days between a & b date objects... 
function dateDiffInDays(a, b) { 
    var _MS_PER_DAY = 1000 * 60 * 60 * 24; 
    // Discard the time and time-zone information. 
    var utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate()); 
    var utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate()); 
    return Math.floor((utc2 - utc1)/_MS_PER_DAY); 
} 

// Calculate how many days between now and an event... 
function daysTill(e) { 
    var eventE = new Date(e); 
    var today = new Date(); 
    return dateDiffInDays(today, eventE); 
} 
+1

Jak adaptować tę metodę do obliczania za pomocą minut? –

+1

W rzeczywistości oblicza różnicę w milisekundach (tysięcznych sekundy) i dzieli wynik przez _MS_PER_DAY na dni. Jeśli chcesz uzyskać minuty, możesz po prostu dodać zmienną "dzielnik", aby ją zastąpić i podać liczbę ms do podziału lub zmienić _MS_PER_DAY na ms na minutę, lub = 1000 * 60 :) –

+1

Dzięki! Rozwiązałem tę wątpliwość po. :) –

4

Można użyć angular-moment obliczyć różnicę, używając amDifference filtr:

Get różnicę pomiędzy dwoma datami w milisekundach. Parametry to data, jednostki i usePrecision. Data domyślnie przyjmuje bieżącą datę. Przykład:

<span>Difference: {{ dateFrom | amDifference : dateTo : 'days' }} days</span> 
-1

Próbowałem poniżej jednego i wyszło mi

var selecteddate = new Date($rootscope.selectvalue); 
$scope.firstDate = selecteddate .getTime(); 
$scope.SecondDate = new Date().getTime(); 

wybrana data jest ten, który jest wybrany z kalendarza, a to przychodzi z zakresu nadrzędnego. Druga data będzie dzisiejszą datą. później znajdę różnicę za pomocą moment diff.

var differenceinDays=parseInt(
     moment.duration(
     moment($scope.firstDate).diff(
      moment($scope.SecondDate) 
     ) 
    ).asDays() 
    ); 

Używam parseInt, ponieważ chcę, aby zwrócić wartość całkowitą tylko

Nadzieja to działa

0

Moment JavaScript Biblioteka jest naprawdę bardzo przydatny i łatwy w użyciu:


var parsedServerOutTime = moment(serverOutTime, "HH:mm:ss"); 
var parsedServerInTime = moment(serverInTime, "HH:mm:ss"); 

var milliseconds= parsedServerOutTime.diff(parsedServerInTime) //default milliseconds 
var days = moment.duration(parsedServerOutTime .diff(parsedServerInTime)).asDays();// For days 

asWeeks();asMonths();asYears(); etc etc Więcej szczegółów sprawdzić http://momentjs.com/docs/