Javascript 如何找到两个日期之间的确切月份和日期-angularjs

Javascript 如何找到两个日期之间的确切月份和日期-angularjs,javascript,angularjs,Javascript,Angularjs,我想计算两个日期之间的月份和天数。然后需要计算用户在开始日期和结束日期之间要支付的成本 成本=10000.00; 周期性=3(四分之一) 月份和天数=(开始日期-结束日期) 需要支付的款项=((月天数/周期)*成本) 我试着找出两个日期之间的时差,但它对我来说不起作用。有人能帮我吗 var date = "2017-06-01"; console.log("date: "+date); var currentDate = $filter('date

我想计算两个日期之间的月份和天数。然后需要计算用户在开始日期和结束日期之间要支付的成本

成本=10000.00; 周期性=3(四分之一)

月份和天数=(开始日期-结束日期)

需要支付的款项=((月天数/周期)*成本)

我试着找出两个日期之间的时差,但它对我来说不起作用。有人能帮我吗

var date = "2017-06-01";
            console.log("date: "+date);
            var currentDate = $filter('date')(date, "yyyy-MM-dd HH:mm:ss");

            $scope.userdob = "2017-08-31";
            var dobdate = $filter('date')($scope.userdob, "yyyy-MM-dd HH:mm:ss");

            console.log("dob: "+dobdate);

            /* differentiate Date */            
            var date1 = $filter('date')($scope.userdob, "yyyy-MM-dd");
            var date2 = $filter('date')(date, "yyyy-MM-dd");

            date1 = date1.split('-');
            date2 = date2.split('-');

            // Now we convert the array to a Date object, which has several  helpful methods
            date1 = new Date(date1[0], date1[1], date1[2]);
            date2 = new Date(date2[0], date2[1], date2[2]);

            if (date1 < date2)
            {
                var start_date = date1;
                var end_date = date2;
                var inverse = false;

                end_date = new Date(end_date); //If you don't do this, the original date passed will be changed. Dates are mutable objects.
                end_date.setDate(end_date.getDate() + 1);

                // Calculate the differences between the start and end dates
                var yearsDifference = end_date.getFullYear() - start_date.getFullYear();

                var monthsDifference = end_date.getMonth() - start_date.getMonth();

                var daysDifference = end_date.getDate() - start_date.getDate();

                var d1 = new Date(end_date.getFullYear(), end_date.getMonth(), 0);
                var noOfDays = d1.getDate();

                $scope.noOfMonths = (inverse ? -1 : 1) * (yearsDifference * 12 + monthsDifference + daysDifference/noOfDays); // Add fractional month 
var date=“2017-06-01”;
控制台日志(“日期:+日期);
var currentDate=$filter('date')(日期,“yyyy-MM-dd HH:MM:ss”);
$scope.userdob=“2017-08-31”;
变量dobdate=$filter('date')($scope.userdob,“yyyy-MM-dd HH:MM:ss”);
控制台日志(“dob:+dobdate”);
/*日期*/
var date1=$filter('date')($scope.userdob,“yyyy-MM-dd”);
var date2=$filter('date')(日期,“yyyy-MM-dd”);
date1=date1.split('-');
date2=date2.split('-');
//现在我们将数组转换为Date对象,它有几个有用的方法
date1=新日期(date1[0],date1[1],date1[2]);
date2=新日期(date2[0],date2[1],date2[2]);
如果(日期1<日期2)
{
var start_date=date1;
var end_date=日期2;
var逆=假;
end_date=new date(end_date);//如果不这样做,传递的原始日期将被更改。日期是可变对象。
end_date.setDate(end_date.getDate()+1);
//计算开始日期和结束日期之间的差异
var yearsDifference=end_date.getFullYear()-start_date.getFullYear();
var monthsDifference=end_date.getMonth()-start_date.getMonth();
var daysDifference=end_date.getDate()-start_date.getDate();
var d1=新日期(end_Date.getFullYear(),end_Date.getMonth(),0);
var noOfDays=d1.getDate();
$scope.noOfMonths=(逆-1:1)*(年差*12+月差+日差/noOfDays);//添加分数月

众所周知,日期操作非常棘手。会发生闰年、闰秒和其他各种形式的时间调整。对于一个大的但远没有详尽的列表,请签出和删除。当对日期和时间做一些不寻常的事情时,最好使用一个好的库,例如。它不会让所有事情都正确,当然,但在大多数情况下,它都能做得很好

它还可以为您处理解析,因此前面的代码可以变成这样:

const date1 = moment($filter('date')($scope.userdob, "yyyy-MM-dd"));
const date2 = moment($filter('date')(date, "yyyy-MM-dd"));

const diffInMonths = date1.diff(date1, 'months');
const diffInDays = date1.diff(date2, 'days');

这解决了我的问题

$scope.startDate = new Date(startDate);

                $scope.endDate = new Date(endDate);

                console.log($scope.startDate);
                console.log($scope.endDate);

                /* differentiate Date */            
                var date1 = $filter('date')($scope.startDate, "yyyy-MM-dd");
                var date2 = $filter('date')($scope.endDate, "yyyy-MM-dd");

                console.log("date1 : "+date1);
                console.log("date2 : "+date2);

                date1 = date1.split('-');
                date2 = date2.split('-');

                // Now we convert the array to a Date object, which has several helpful methods
                /*date1 = new Date(date1[0], date1[1], date1[2]);
                date2 = new Date(date2[0], date2[1], date2[2]);*/

                console.log("date1 : "+date1);
                console.log("date2 : "+date2);
                if ($scope.startDate < $scope.endDate)
                {
                    var start_date = date1;
                    var end_date = date2;
                    var inverse = false;
                    console.log("end_date : "+end_date);

                    end_date = new Date(end_date); //If you don't do this, the original date passed will be changed. Dates are mutable objects.
                   console.log("end_date : "+end_date); end_date.setDate(end_date.getDate() + 1);

                    start_date = new Date(start_date);


                    // Calculate the differences between the start and end dates
                    var yearsDifference = end_date.getFullYear() - start_date.getFullYear();

                    var monthsDifference = end_date.getMonth() - start_date.getMonth();

                    var daysDifference = end_date.getDate() - start_date.getDate();

                    var d1 = new Date(end_date.getFullYear(), end_date.getMonth(), 0);
                    var noOfDays = d1.getDate();

                    if(noOfDays >= 30) {
                        noOfDays = 30;
                    }

                    var days = daysDifference/noOfDays;

                    console.log(days);

                    $scope.noOfMonths = (inverse ? -1 : 1) * (yearsDifference * 12 + monthsDifference + days); // Add fractional month

                    console.log($scope.noOfMonths);
$scope.startDate=新日期(startDate);
$scope.endDate=新日期(endDate);
console.log($scope.startDate);
log($scope.endDate);
/*日期*/
var date1=$filter('date')($scope.startDate,“yyyy-MM-dd”);
var date2=$filter('date')($scope.endDate,“yyyy-MM-dd”);
console.log(“date1:+date1”);
console.log(“date2:+date2”);
date1=date1.split('-');
date2=date2.split('-');
//现在我们将数组转换为Date对象,它有几个有用的方法
/*date1=新日期(date1[0],date1[1],date1[2]);
date2=新日期(date2[0],date2[1],date2[2])*/
console.log(“date1:+date1”);
console.log(“date2:+date2”);
如果($scope.startDate<$scope.endDate)
{
var start_date=date1;
var end_date=日期2;
var逆=假;
控制台日志(“结束日期:+结束日期”);
end_date=new date(end_date);//如果不这样做,传递的原始日期将被更改。日期是可变对象。
console.log(“end_date:+end_date”);end_date.setDate(end_date.getDate()+1);
开始日期=新日期(开始日期);
//计算开始日期和结束日期之间的差异
var yearsDifference=end_date.getFullYear()-start_date.getFullYear();
var monthsDifference=end_date.getMonth()-start_date.getMonth();
var daysDifference=end_date.getDate()-start_date.getDate();
var d1=新日期(end_Date.getFullYear(),end_Date.getMonth(),0);
var noOfDays=d1.getDate();
如果(中午>=30){
中午=30天;
}
变量天数=日差/无天数;
控制台日志(天);
$scope.noOfMonths=(逆-1:1)*(年差异*12+月差异+天);//添加分数月
console.log($scope.noOfMonths);

你所说的月是什么意思?整整30天?玩弄日期是一件痛苦的事,我的建议是看看这样的东西-虽然这不能回答你的问题,但这个库为我节省了大量时间:)它将分解实际的日历月和闰年等谢谢你的建议。谢谢你的建议N
$scope.startDate = new Date(startDate);

                $scope.endDate = new Date(endDate);

                console.log($scope.startDate);
                console.log($scope.endDate);

                /* differentiate Date */            
                var date1 = $filter('date')($scope.startDate, "yyyy-MM-dd");
                var date2 = $filter('date')($scope.endDate, "yyyy-MM-dd");

                console.log("date1 : "+date1);
                console.log("date2 : "+date2);

                date1 = date1.split('-');
                date2 = date2.split('-');

                // Now we convert the array to a Date object, which has several helpful methods
                /*date1 = new Date(date1[0], date1[1], date1[2]);
                date2 = new Date(date2[0], date2[1], date2[2]);*/

                console.log("date1 : "+date1);
                console.log("date2 : "+date2);
                if ($scope.startDate < $scope.endDate)
                {
                    var start_date = date1;
                    var end_date = date2;
                    var inverse = false;
                    console.log("end_date : "+end_date);

                    end_date = new Date(end_date); //If you don't do this, the original date passed will be changed. Dates are mutable objects.
                   console.log("end_date : "+end_date); end_date.setDate(end_date.getDate() + 1);

                    start_date = new Date(start_date);


                    // Calculate the differences between the start and end dates
                    var yearsDifference = end_date.getFullYear() - start_date.getFullYear();

                    var monthsDifference = end_date.getMonth() - start_date.getMonth();

                    var daysDifference = end_date.getDate() - start_date.getDate();

                    var d1 = new Date(end_date.getFullYear(), end_date.getMonth(), 0);
                    var noOfDays = d1.getDate();

                    if(noOfDays >= 30) {
                        noOfDays = 30;
                    }

                    var days = daysDifference/noOfDays;

                    console.log(days);

                    $scope.noOfMonths = (inverse ? -1 : 1) * (yearsDifference * 12 + monthsDifference + days); // Add fractional month

                    console.log($scope.noOfMonths);