2016-03-20 6 views
1

****給与の種類のいくつかの分数の日を持っている場合。****(javascriptまたは/およびdatejs)2つの日付間隔の合計給与を計算しようとしています。開始日と終了日は、毎月月

var getDiffDatesSalary = function days_between(date1,date2, monthlyBasic) { 
     var dateObj1 = new Date(date1); 
     var month1 = dateObj1.getMonth(); //months from 1-12 
     var day1 = dateObj1.getDate(); 
     var year1 = dateObj1.getFullYear(); 
     var daysInMonth1 = Date.getDaysInMonth(year1, month1); 

     var dateObj2 = new Date(date2); 
     var month2 = dateObj2.getMonth(); //months from 0-11 
     var day2 = dateObj2.getDate();// days from 1 
     var year2 = dateObj2.getFullYear(); 
     var daysInMonth2 = Date.getDaysInMonth(year2, month2); 

     var date1FractionDays = daysInMonth1 - day1; 
     var date2FractionDays = daysInMonth2 - day2; 
     var newDate1, newDate2; 
     if(day1 > 1){ 
      var perDaySalary1 = monthlyBasic/daysInMonth1; 
      var thisMonthFarctionDaysSalaryForDate1 = perDaySalary1 * date1FractionDays; 
      month1 += 1; // after calculate fraction this month basic, round month from next 
      newDate1 = new Date(year1,month1); 
     } 
     if(day2 !== daysInMonth2){ 
      var perDaySalary2 = monthlyBasic/daysInMonth2; 
      var thisMonthFarctionDaysSalaryForDate2 = perDaySalary2 * day2; 
      month2 -= 1; //after calculate fraction this month basic, round month from previous 
      newDate2 = new Date(year2,month2); 
     } 

     // i want to calculate totalSalaryamount of date ranges 
     // var totalFractionDaysSalary = thisMonthFarctionDaysSalaryForDate1 + thisMonthFarctionDaysSalaryForDate2; 
     // var totalMonthsSalay = roundMonths * monthlyBasic; 
     // var totalSalaryamount = totalFractionDaysSalary + totalMonthsSalay; 

    }; 

**

結果= thisMonthFarctionDaysSalaryForDate1 + thisMonthFarctionDaysSalaryForDate2 +(roundMonths * monthlyBasic)

結果はgetDiffDatesSalary( "2016/01/15"、 "2016/03/25"、1000)となります。 + 1000年

516.13 + 806.45 //合計:2322.58

または/およびgetDiffDatesSalary( "2015年1月15日"、 "2016年3月25日"、1000);

516.13 + 806.45 +(* 13 1000)//合計:14322.58

または/およびgetDiffDatesSalary( "2016年1月1日"、 "2016年2月29日"、1000);

* 2 // 2000年1000年

**

+0

私はこの機能を修正するために助けが必要(http://momentjs.com/) – Zamboney

+0

[ 'momentjs']を使用してみてください。私はしようとしたができません..ありがとうZamboney –

+0

は、同じ日の一日ですか? –

答えて

0

私は2つのセクションでタスクを分割することをお勧め:

  1. は合計日数
  2. 計算給与を取得します。

この提案では、年月日と日数の差を使用し、日差がマイナスの場合に修正を行います。同じ日は1日を意味します。

function getDays(date1, date2) { 
 
    var date1Obj = new Date(date1), 
 
     date2Obj = new Date(date2), 
 
     totalYear = date2Obj.getFullYear() - date1Obj.getFullYear(), 
 
     totalMonth = date2Obj.getMonth() - date1Obj.getMonth(), 
 
     totalDay = date2Obj.getDate() - date1Obj.getDate() + 1; 
 

 
    if (totalDay < 0) { 
 
     totalMonth--; 
 
     totalDay += new Date(date1Obj.getFullYear(), date1Obj.getMonth(), 0).getDate(); 
 
    } 
 

 
    return 360 * totalYear + 30 * totalMonth + totalDay; 
 
} 
 

 
function getDiffDatesSalary(date1, date2, salaryPerMonth) { 
 
    return getDays(date1, date2) * salaryPerMonth/30; 
 
} 
 

 
document.write(getDiffDatesSalary("2016/01/15", "2016/03/25", 1000) + '<br>'); 
 
document.write(getDiffDatesSalary("2016/01/31", "2016/02/15", 1000) + '<br>'); 
 
document.write(getDiffDatesSalary("2016/03/20", "2016/03/20", 3000) + '<br>');

+0

素晴らしい考えをありがとう –

+0

関数getDiffDatesSalary(date1、date2、salaryPerMonth){ return getDays(date1、date2)* salaryPerMonth/30; } –

+0

正確な結果が表示されません。毎月30日ではないためです。 1月31日、4月30日など....毎月の1000とdate1が15/01の場合、16日の給与は(1000/31)* 16になり、date1が15/02の場合は14日の給与が( 1000/29)* 14。 12/02のように日付2の場合と逆の場合は、12日の給与が計算されます。 –

0

私は私の質問の答えを得ました。もし誰かがこの答えを必要としたり改善したりしたら。ここでは、作業コードは次のとおりです。

var getDiffDatesSalary = function days_between(date1,date2, monthlyBasic) { 
    var dateObj1 = new Date(date1); 
    var month1 = dateObj1.getMonth(); //months from 0-11 
    var day1 = dateObj1.getDate(); 
    var year1 = dateObj1.getFullYear(); 
    var daysInMonth1 = Date.getDaysInMonth(year1, month1); 

    var dateObj2 = new Date(date2); 
    var month2 = dateObj2.getMonth(); //months from 0-11 
    var day2 = dateObj2.getDate();// days from 1 
    var year2 = dateObj2.getFullYear(); 
    var daysInMonth2 = Date.getDaysInMonth(year2, month2); 
    //get number of months in two different dates; 
    var diffMonths = parseInt(diffInMonths(date2,date1)) +1; //from 1-12 

    var date1FractionDays = daysInMonth1 - day1; // date1 fraction days 
    var date2FractionDays = daysInMonth2 - day2; // date2 fraction days 
    var totalFractionDaysSalary= 0, fractionMonthsCount = 0, thisMonthFarctionDaysSalaryForDate1 = 0, thisMonthFarctionDaysSalaryForDate2 =0; //reset as 0; 
    //when date1: day start from 01, no fraction start of the month. Otherwise calculate salary for fraction days 
    if(day1 > 1){ 
     var perDaySalary1 = monthlyBasic/daysInMonth1; 
     thisMonthFarctionDaysSalaryForDate1 = perDaySalary1 * date1FractionDays; 
     fractionMonthsCount +=1; 
    } 
    //when date2: day end === end Of the Month, no fraction. Otherwise calculate salary for fraction days 
    if(day2 !== daysInMonth2){ 
     var perDaySalary2 = monthlyBasic/daysInMonth2; 
     thisMonthFarctionDaysSalaryForDate2 = perDaySalary2 * day2; 
     fractionMonthsCount +=1; 
    } 
    // both date1 date2 fraction days salary sum 
    totalFractionDaysSalary = thisMonthFarctionDaysSalaryForDate1 + thisMonthFarctionDaysSalaryForDate2; 
    var roundMonthsForSalary = diffMonths - fractionMonthsCount; // after less round month calculate 
    // if user do wrong reset as 0. because negative month not possible 
    if (roundMonthsForSalary < 0){ 
     roundMonthsForSalary = 0; 
    } 
    // round month salary calculation 
    var totalSalaryForRoundMonths = roundMonthsForSalary * monthlyBasic; 
// finally fraction days and round month sum to get return result. 
return totalFractionDaysSalary + totalSalaryForRoundMonths; 

}; 
// get number of months in two different dates 
function diffInMonths(to,from){ 
    var months = to.getMonth() - from.getMonth() + (12 * (to.getFullYear() - from.getFullYear())); 

    if(to.getDate() < from.getDate()){ 
     var newFrom = new Date(to.getFullYear(),to.getMonth(),from.getDate()); 
     if (to < newFrom && to.getMonth() == newFrom.getMonth() && to.getYear() %4 != 0){ 
      months--; 
     } 
    } 

    return months; 
}; 
関連する問題