2015-07-02 4 views
0

Мне нужно найти способ рассчитать окончательный срок кредита, используя JavaScript, на котором учитываются месяцы с менее чем 31 или 30 днями и действует раз в полгода.Расчеты по срокам погашения по месяцам в Javascript

Например, если у меня есть полумесячный срок в 12 (6 месяцев), а мой начальный_датчик - 01/31/2015, моя окончательная дата должна быть 6/15/2016. Есть идеи?

Вот что я за раз в месяц:

var addMonths = (function() { 
    var counts = { 
    normal: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], 
    leap: [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 
    }; 
    return function(startDate, months) { 
    var endYear = startDate.getFullYear() + Math.ceil((months + startDate.getMonth())/12) - 1; 
    var yearType = ((endYear % 4 == 0) && (endYear % 100 != 0)) || (endYear % 400 == 0) ? 'leap' : 'normal'; 
    var endMonth = (startDate.getMonth() + months) % 12; 
    var endDate = Math.min(startDate.getDate(), counts[yearType][endMonth]); 
    return new Date(endYear, endMonth, endDate); 
    }; 
}()); 

var date = new Date("contractDate"); 
var year = date.getFullYear(); 
var month = date.getMonth(); 
var day = date.getDate(); 
var newDate = new Date(year, month, day); 

var result = addMonths(newDate, term-1); 
+0

Да. Много идей. Какую именно часть вы застряли? –

+0

Я добавил код, который я использую для ежемесячного использования. –

+0

Hi @JosephMarikle. Я пробую «contractDate» от 9/1/2015 и «срок» 53, но получаю неправильный результат, используя приведенную выше формулу. Вместо 1/1/2020 он показывает 1/1/2019. Любые идеи, как это происходит? –

ответ

0

Предполагая, что все, что вы размещены правильно 06/15/2016, не соответствует 6 месяцев от 01/31/2015.

Правильная дата должна быть: Пятницы, 31 июля 2015 (07/31/2015)

Вот пример того, как получить 6 месяцев от текущей даты в JavaScript.

function getDaysInMonth(month, year) { 
    return new Date(year, month, 0).getDate(); 
} 

var dateStarted = new Date(Date.parse("01/31/2015")) 
var dateEnded = dateStarted.getTime(); 
var termMonths = 6 // Pure Month Count 

for(var monthCount = dateStarted.getMonth() + 1; monthCount < dateStarted.getMonth() + (termMonths + 1); monthCount++) { 
    dateEnded += (24*3600000) * getDaysInMonth(monthCount, dateStarted.getFullYear()); 
} 

console.log(new Date(dateEnded)) 

Большая вещь здесь:

dateEnded += (24*3600000) * getDaysInMonth(monthCount, dateStarted.getFullYear()); 

Так dateStarted преобразовывает время в миллисекундах (Отметка времени Unix).

dateEnded обновляется с количеством миллисекунд в каждый месяц после даты начала.

Поскольку в час вам нужно 3600000 миллисекунд, вам нужно время, чтобы на 24 получить миллисекунды, которые находятся за один день. Затем вам нужно умножить это число на количество дней в месяце.

После добавления всех месяцев вместе, вы должны преобразовать это значение в формат, пригодный:

console.log(new Date(dateEnded)) 
+0

Спасибо за ваш ответ. Проблема здесь в том, что я пытаюсь решить в течение полугода. Например, если у меня есть срок 2, который является полумесяцем, а ваша первая дата выплаты - 1/1/2015, ваша окончательная дата должна быть 1/15/2015. Я попробовал приведенный выше пример, но, похоже, это не так правильно. : \ –

+0

Используйте то, что я дал в качестве базы. Затем вместо 3600000 используйте 1800000. Вам все равно понадобится цикл через каждый месяц, но вместо добавления всего месяца вам просто нужно добавить половину его. – Bioto

+0

Спасибо. Я изменил, но вот результаты, которые я получаю: –

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