разница в датах в месяцах в javascript

#javascript

#javascript

Вопрос:

Нужна разница в датах в месяцах.

Если я укажу дату начала как 1 февраля 2011 года, а текущую дату как 2 апреля 2011 года, то это должно привести к результату 2.2.

Это означает, что сначала следует вычислить месяцы, а затем количество дней в десятичном значении.

Посмотрите, составляет ли разница в датах 3 месяца и 22 дня, тогда она должна давать разницу в 3,22

Возможно ли это с помощью Javascript.

Комментарии:

1. на SO уже задано так много вопросов, связанных с вашим вопросом. Смотрите соответствующий раздел.

2. Разве с 1 февраля 2011 года по 2 апреля 2011 года не должно быть 2,1 месяца?

3. перейдите сюда w3schools.com/js/js_obj_date.asp и посчитайте

4. смотрите DateJS

5. @Ates Goral конечно, stackoverflow 😀

Ответ №1:

 var date1 = new Date(2011,1,1);
var date2 = new Date(2011,3,2);
var diffYears = date2.getFullYear()-date1.getFullYear();
var diffMonths = date2.getMonth()-date1.getMonth();
var diffDays = date2.getDate()-date1.getDate();

var months = (diffYears*12   diffMonths);
if(diffDays>0) {
    months  = '.' diffDays;
} else if(diffDays<0) {
    months--;
    months  = '.' (new Date(date2.getFullYear(),date2.getMonth(),0).getDate() diffDays);
}
alert(months);
  

Комментарии:

1. Я знаю, что это ОЧЕНЬ старый ответ, но для протокола, это неправильно. Это не учитывает, что месяц date1 больше. но год меньше, чем date2.

2. Это действительно очень старый ответ. Но я не смог воспроизвести проблему, о которой вы упомянули. Если месяц date1 больше месяца date2, разница в месяцах будет отрицательной, а математика все равно будет хорошей. Я что-то упускаю?

3. ЛОЛ, нет, ты ничего не упускаешь, похоже, я это пропустил. Спасибо за ответ.

Ответ №2:

Смотрите http://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/demos/calendar/time-cajita.js# для библиотеки даты и времени RFC 2445.

time.durationBetween возвращает значение продолжительности, которое является разницей между двумя датами.

Вы можете увидеть примеры использования в unittests

Ответ №3:

не точно, но вы можете получить приблизительную оценку с помощью этого:

 var d=new Date(2010,00,01); //start date
var dd=new Date(2010,11,31); //end date
var dif=dd-d //get difference in milliseconds
var m=dif/(86400000*30); //1000*60*60*24=>86400000 gives one day
  

Это дает 12.133 ~ для вышеуказанных дат.

Ответ №4:

приведенный ниже пример дает результат 2.2 для ваших дат

 var d1 = new Date(2011, 1, 1);
var d2 = new Date(2011, 3, 2);

var ydiff = d2.getYear() - d1.getYear();
var mdiff = d2.getMonth() - d1.getMonth();
var ddiff = 1   d2.getDate() - d1.getDate();

var diff = (ydiff*12   mdiff   ".")   ddiff;
alert(diff);
  

Ответ №5:

Я надеюсь, что это поможет. работает на 100%.

     var startDate = '13.06.2013'; // for example (i got it from input)
    var endDate = '12.02.2016'; // for example
    var temp_sd = explode('.', startDate);
    var temp_ed = explode('.', endDate);
    var row_id = $(this).attr('row_id');

    var m_arr = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // 365 days in year
    var m_arr_vis = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // 366 days
    var temp_year = parseInt(temp_sd[2]);
    var temp_month = parseInt(temp_sd[1]);
    var daysInM, temp_s, temp_e, m_diff = 0;
    while(true) {
        if(temp_month === parseInt(temp_sd[1])) {
            temp_s = parseInt(temp_sd[0]);
        } else {
            temp_s = 1;
        }
        if((temp_year%4) === 0) {
            daysInM = m_arr_vis[temp_month-1];
        } else {
            daysInM = m_arr[temp_month-1];
        }
        if(temp_month === parseInt(temp_ed[1])) {
            temp_e = parseInt(temp_ed[0]);
        } else {
            temp_e = daysInM;
        }

        m_diff  = (temp_e-temp_s 1)/daysInM;

        //alert(temp_s ' -> ' temp_e ' . ' temp_month ' . ' temp_year);
        //alert(temp_e-temp_s 1);
        //alert(daysInM);
        if((temp_year === parseInt(temp_ed[2]))amp;amp;(temp_month === parseInt(temp_ed[1]))) break;
        // inc temp_month
        if(temp_month<12) {
            temp_month  ;
        } else {
            temp_month = 1;
            // inc temp_years
            temp_year  ;
        }
    }

    var months = Number(m_diff).toFixed(7);
  

     function explode( delimiter, string ) { // Split a string by string
    // 
    //     original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    //     improved by: kenneth
    //     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)

    var emptyArray = { 0: '' };

    if ( arguments.length != 2
            || typeof arguments[0] == 'undefined'
            || typeof arguments[1] == 'undefined' )
    {
            return null;
    }

    if ( delimiter === ''
            || delimiter === false
            || delimiter === null )
    {
            return false;
    }

    if ( typeof delimiter == 'function'
            || typeof delimiter == 'object'
            || typeof string == 'function'
            || typeof string == 'object' )
    {
            return emptyArray;
    }

    if ( delimiter === true ) {
            delimiter = '1';
    }

    return string.toString().split ( delimiter.toString() );
}