2016-03-20 13 views
1

**** Maaş tip bazı fraksiyon gün çektiğini. ****(javascript veya/ve datejs) İki tarih aralığını toplam maaş hesaplamaya çalışıyor. Başlangıç ​​ve bitiş tarihi, aylık ay

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; 

    }; 

**

sonuç = thisMonthFarctionDaysSalaryForDate1 + thisMonthFarctionDaysSalaryForDate2 + (roundMonths * monthlyBasic)

sonucu getDiffDatesSalary ("2016/01/15", "2016/03/25", 1000); + 1000

516,13 + 806,45 // toplam: 2322,58

ve/veya getDiffDatesSalary ("2015/01/15", "2016/03/25", 1000);

516,13 + 806,45 + (* 13 1000) // toplam: 14322,58

ve/veya getDiffDatesSalary ("2016/01/01", "2016/02/29", 1000); * 2 // 2000

**

+0

deneyin [ 'momentjs'] ile (http://momentjs.com/) – Zamboney

+0

Bu işlevinin düzeltilmesi için ihtiyaç. Denedim ama yapamam .. Teşekkürler Zamboney –

+0

bir gün aynı gün mü? –

cevap

0

İki bölüm halinde görevi bölmek önermek:

  1. toplam days
  2. hesaplayın maaş alın.

Bu teklif yıl, ay ve gün arasındaki farkı kullanır ve gün farkı negatifse bir düzeltme yapar. Aynı gün bir gün demektir.

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

Harika bir fikir için teşekkürler –

+0

işlevi getDiffDatesSalary (date1, date2, salaryPerMonth) { getDays (date1, date2) * salaryPerMonth/30; } –

+0

Tam olarak gösterilmiyor .. çünkü her ay 30 gün değil. 29 Şubat gibi, 31 Ocak, 30 Nisan ... Eğer aylık 1000 ve date1 15/01 ise o zaman 16 gün maaş (1000/31) * 16. olacak ve eğer tarih1 15/02 ise 14 gün maaş olacak (1000/29) * 14. 12/02 gibi tarih2 için tersine 12 gün sonra maaş hesaplanacak. –

0

Sorumun cevabını aldık. Bu cevabı isteyen veya iyileştiren biri varsa. İşte çalışan kodları geçerli:

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; 
}; 
İlgili konular