#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() );
}