Функция JavaScript для добавления X месяцев к дате - PullRequest
179 голосов
/ 25 апреля 2010

Я ищу самый простой и чистый способ добавить X месяцев к дате JavaScript.

Я бы не стал справляться с переносом года или мне пришлось бы написать собственную функцию .

Есть ли что-то встроенное, что может сделать это?

Ответы [ 17 ]

1 голос
/ 28 мая 2018

Я написал это альтернативное решение, которое прекрасно работает для меня. Это полезно, когда вы хотите рассчитать окончание контракта. Например, начало = 2016-01-15, месяцы = 6, конец = 2016-7-14 (то есть последний день - 1):

<script>
function daysInMonth(year, month)
{
    return new Date(year, month + 1, 0).getDate();
}

function addMonths(date, months)
{
    var target_month = date.getMonth() + months;
    var year = date.getFullYear() + parseInt(target_month / 12);
    var month = target_month % 12;
    var day = date.getDate();
    var last_day = daysInMonth(year, month);
    if (day > last_day)
    {
        day = last_day;
    }
    var new_date = new Date(year, month, day);
    return new_date;
}

var endDate = addMonths(startDate, months);
</script>

Примеры:

addMonths(new Date("2016-01-01"), 1); // 2016-01-31
addMonths(new Date("2016-01-01"), 2); // 2016-02-29 (2016 is a leap year)
addMonths(new Date("2016-01-01"), 13); // 2017-01-31
addMonths(new Date("2016-01-01"), 14); // 2017-02-28
0 голосов
/ 24 августа 2012

Ниже приведен пример расчета будущей даты на основе ввода даты (membersssignup_date) + добавленных месяцев (membershipsmonths) через поля формы.

Поле membershipsmonths имеет значение по умолчанию 0

Триггерная ссылка (может быть событием onchange, прикрепленным к полю условия членства):

<a href="#" onclick="calculateMshipExp()"; return false;">Calculate Expiry Date</a>

function calculateMshipExp() {

var calcval = null;

var start_date = document.getElementById("membershipssignup_date").value;
var term = document.getElementById("membershipsmonths").value;  // Is text value

var set_start = start_date.split('/');  

var day = set_start[0];  
var month = (set_start[1] - 1);  // January is 0 so August (8th month) is 7
var year = set_start[2];
var datetime = new Date(year, month, day);
var newmonth = (month + parseInt(term));  // Must convert term to integer
var newdate = datetime.setMonth(newmonth);

newdate = new Date(newdate);
//alert(newdate);

day = newdate.getDate();
month = newdate.getMonth() + 1;
year = newdate.getFullYear();

// This is British date format. See below for US.
calcval = (((day <= 9) ? "0" + day : day) + "/" + ((month <= 9) ? "0" + month : month) + "/" + year);

// mm/dd/yyyy
calcval = (((month <= 9) ? "0" + month : month) + "/" + ((day <= 9) ? "0" + day : day) + "/" + year);

// Displays the new date in a <span id="memexp">[Date]</span> // Note: Must contain a value to replace eg. [Date]
document.getElementById("memexp").firstChild.data = calcval;

// Stores the new date in a <input type="hidden" id="membershipsexpiry_date" value="" name="membershipsexpiry_date"> for submission to database table
document.getElementById("membershipsexpiry_date").value = calcval;
}
0 голосов
/ 17 октября 2013
var a=new Date();
a.setDate(a.getDate()+5);

Как указано выше, вы можете добавить месяц к функции Date.

0 голосов
/ 31 октября 2013
addDateMonate : function( pDatum, pAnzahlMonate )
{
    if ( pDatum === undefined )
    {
        return undefined;
    }

    if ( pAnzahlMonate === undefined )
    {
        return pDatum;
    }

    var vv = new Date();

    var jahr = pDatum.getFullYear();
    var monat = pDatum.getMonth() + 1;
    var tag = pDatum.getDate();

    var add_monate_total = Math.abs( Number( pAnzahlMonate ) );

    var add_jahre = Number( Math.floor( add_monate_total / 12.0 ) );
    var add_monate_rest = Number( add_monate_total - ( add_jahre * 12.0 ) );

    if ( Number( pAnzahlMonate ) > 0 )
    {
        jahr += add_jahre;
        monat += add_monate_rest;

        if ( monat > 12 )
        {
            jahr += 1;
            monat -= 12;
        }
    }
    else if ( Number( pAnzahlMonate ) < 0 )
    {
        jahr -= add_jahre;
        monat -= add_monate_rest;

        if ( monat <= 0 )
        {
            jahr = jahr - 1;
            monat = 12 + monat;
        }
    }

    if ( ( Number( monat ) === 2 ) && ( Number( tag ) === 29 ) )
    {
        if ( ( ( Number( jahr ) % 400 ) === 0 ) || ( ( Number( jahr ) % 100 ) > 0 ) && ( ( Number( jahr ) % 4 ) === 0 ) )
        {
            tag = 29;
        }
        else
        {
            tag = 28;
        }
    }

    return new Date( jahr, monat - 1, tag );
}


testAddMonate : function( pDatum , pAnzahlMonate )
{
    var datum_js = fkDatum.getDateAusTTMMJJJJ( pDatum );
    var ergebnis = fkDatum.addDateMonate( datum_js, pAnzahlMonate );

    app.log( "addDateMonate( \"" + pDatum + "\", " + pAnzahlMonate + " ) = \"" + fkDatum.getStringAusDate( ergebnis ) + "\"" );
},


test1 : function()
{
    app.testAddMonate( "15.06.2010",    10 );
    app.testAddMonate( "15.06.2010",   -10 );
    app.testAddMonate( "15.06.2010",    37 );
    app.testAddMonate( "15.06.2010",   -37 );
    app.testAddMonate( "15.06.2010",  1234 );
    app.testAddMonate( "15.06.2010", -1234 );
    app.testAddMonate( "15.06.2010",  5620 );
    app.testAddMonate( "15.06.2010", -5120 );

}
0 голосов
/ 15 сентября 2014

Как показывают многие из сложных, безобразных ответов, «Даты и времена» могут стать кошмаром для программистов, использующих любой язык. Мой подход заключается в том, чтобы преобразовать даты и значения «delta t» в время эпохи (в мс), выполнить любую арифметику, а затем преобразовать обратно в «человеческое время».

// Given a number of days, return a Date object
//   that many days in the future. 
function getFutureDate( days ) {

    // Convert 'days' to milliseconds
    var millies = 1000 * 60 * 60 * 24 * days;

    // Get the current date/time
    var todaysDate = new Date();

    // Get 'todaysDate' as Epoch Time, then add 'days' number of mSecs to it
    var futureMillies = todaysDate.getTime() + millies;

    // Use the Epoch time of the targeted future date to create
    //   a new Date object, and then return it.
    return new Date( futureMillies );
}

// Use case: get a Date that's 60 days from now.
var twoMonthsOut = getFutureDate( 60 );

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

РЕДАКТИРОВАТЬ: Полный источник здесь !

0 голосов
/ 30 сентября 2014

Иногда полезно создать дату одним оператором, как в параметрах BIRT

Я сделал 1 месяц назад с:

new Date(new Date().setMonth(new Date().getMonth()-1));   
0 голосов
/ 02 марта 2015

Все это кажется слишком сложным, и я предполагаю, что он вступает в дискуссию о том, что именно означает добавление «месяца». Это значит 30 дней? Это означает с 1-го по 1-е? С последнего дня до последнего дня?

Если последнее, то добавление месяца к 27 февраля приведет вас к 27 марта, а добавление месяца к 28 февраля - к 31 марта (за исключением високосных лет, когда вы получите 28 марта). Затем вычитая месяц с 30 марта, вы получаете ... 27 февраля? Кто знает ...

Для тех, кто ищет простое решение, просто добавьте миллисекунды и все готово.

function getDatePlusDays(dt, days) {
  return new Date(dt.getTime() + (days * 86400000));
}

или

Date.prototype.addDays = function(days) {
  this = new Date(this.getTime() + (days * 86400000));
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...