2013-03-08 7 views
7

Я довольно новичок в angularjs, но здесь он идет. Я могу две даты через angularjs в форме dd/mm/yyyy, но то, что мне нужно сделать, это как-то вычесть две даты, чтобы получить разницу в днях между ними. Я создал функцию jquery для этого, но я не знаю, как передать две даты функции. Поэтому мне было интересно, есть ли другой способ сделать это?Как вычесть две переменные даты в диапазоне

Я пытаюсь настроить спусковую систему в зависимости от количества дней между двумя датами для стилизации определенных вещей. Например, если в течение 10 дней я хочу использовать стиль 1, и если его в течение 20 дней использовать стиль 2 и так далее.

+0

Что делает ваш код выглядит? –

+0

Любые мысли по 2 ответам добавлены? –

ответ

2

Я также начинаю с угловатыми новичками, но не справитесь с этим, сделав свойства доступными через вашу модель просмотра javascript?

Например, у меня есть поле , которое изменяется в зависимости от полей даты (например, стиль возвращает стиль 1, если разница составляет 10 дней) и, надеюсь, через привязку к угловому связыванию обновления будут распространяться на экран.

Я думаю, что правильный термин для этого является вычисляется свойство или рассчитывается свойство

EDIT

Не уверен, если это то, что вы ищете, но увидеть скрипку, например, из расчет даты и изменения стиля, основанного на свойствах модели представления (область)

scope.diff и scope.col являются 2 свойствами для b инд к

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

Ну, я думаю, реальная проблема заключается в том, как я могу рассчитать разные дни? – user1399078

+0

@ user1399078 см. Скрипка и код добавлен - возможно, это помогает –

+0

@ChrisMoutray это отличный пример, но как это сделать для каждого элемента в массиве? – vittore

12

Основная 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; 

Используя одну из библиотек Дата (например, moment.js):

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

вы просто преобразовать дату в метку времени, а затем вычесть.

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

Это работает, и вот 2 безупречные функции даты javascript, которые вы никогда не должны быть без ...

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

Как адаптировать этот метод для вычисления с помощью минут? –

+1

Это фактически вычисляет разницу в миллисекундах (тысячные доли секунды) и делит результат на _MS_PER_DAY, чтобы получить дни. Поэтому, если вы хотите получить минуты, вы можете просто добавить переменную «divisor», чтобы заменить ее, и передать количество мс для разделения или изменить _MS_PER_DAY на миллисекунд в минуту или = 1000 * 60 :) –

+1

Спасибо! После этого я решил это. :) –

4

Вы можете использовать angular-moment для вычисления разности, используя фильтрamDifference:

Получить разницу между двумя датами в миллисекундах. Параметры: дата, ед. Ед. Использование. Точность. Дата по умолчанию соответствует текущей дате. Пример:

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

Я попытался ниже одного, и она работала для меня

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

Выбранная дата является тот, который выбран из каландра и он исходит из родительской области. вторая дата будет сегодняшней. позже я найду разницу, используя момент diff.

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

Я использую ParseInt, потому что я хочу, чтобы вернуть целое значение только

Надеются, что это работает

0

Момент JavaScript библиотека действительно очень полезная и простая в использовании:


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(); и т.д. и т.д. для получения более подробной информации проверить http://momentjs.com/docs/

Смежные вопросы