How to subtract two angularjs date variables

后端 未结 7 1043
说谎
说谎 2020-12-01 21:53

I am fairly new to angularjs, but here it goes. I am able two dates through angularjs in the form dd/mm/yyyy, but what I need to do is somehow subtract the two

相关标签:
7条回答
  • 2020-12-01 22:18

    You can use angular-moment to calculate the difference, using the amDifference filter:

    Get the difference between two dates in milliseconds. Parameters are date, units and usePrecision. Date defaults to current date. Example:

    <span>Difference: {{ dateFrom | amDifference : dateTo : 'days' }} days</span>
    
    0 讨论(0)
  • 2020-12-01 22:23

    This works, and here are 2 flawless javascript date functions you should never be without...

    // 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);
    }
    
    0 讨论(0)
  • 2020-12-01 22:25

    Basic javascript way:

    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;
    

    Using one of the Date libraries (such as moment.js):

    var d1 = moment("01/16/2013");
    var d2 = moment("02/26/2013");
    var days = moment.duration(d2.diff(d1)).asDays();
    
    0 讨论(0)
  • 2020-12-01 22:29

    I'm also an angularjs novice but wouldn't you handle this by making properties available through your javascript view model?

    For example have a style field that changes based on the date fields (ie style returns style 1 when if the difference is 10 days) and hopefully through the angularjs binding the updates will propagate to the screen.

    I think the right term for this is a computed property or calculated property

    EDIT

    Not sure if this is what you're looking for but see fiddle for example of calculating date diff and changing a style all based off properties of the view model (scope)

    scope.diff and scope.col are the 2 properties to bind to

    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 讨论(0)
  • 2020-12-01 22:30

    The moment JavaScript library is really very useful and easy to use:


    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 for more details check http://momentjs.com/docs/

    0 讨论(0)
  • 2020-12-01 22:30

    I tried the below one and it worked out for me

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

    selected date is the one which is selected from calender and it is coming from parent scope. second date will be today's date. later i will find difference using moment diff.

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

    I am using parseInt because i want to return the integer value only

    Hope this works

    0 讨论(0)
提交回复
热议问题