 
			
				16.04.2013, 13:21
			
			
			
		  
	 | 
 
	
		
		
		
			
			
			
				
				
				
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.07.2008 
					
					
					
						Сообщений: 3,873
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Промежуток времени между датами
			 
			
		
		
		
		Обычно используют «финансовый год» (12 месяцев по 30 дней = 360 дней), тут все просто, количество дней между датами: 
количество миллисекунд между датами / 1000 миллисекунд / 60 секунд / 60 минут / 24 часа
потом количество дней делим нацело на 360… и т.д…
 
Но как быть, если необходимо узнать точный календарный период времени между двумя датами? 
В JavaScript объект Date умеет перескакивать на следующий месяц, если значение переданное в метод setDate, превышает количество дней в месяце. Выполняя  date.setDate(date.getDate() + 1) можно в цикле пройтись по всем дням в указанном промежутке и посчитать количество календарных месяцев:
  
Например, с 10.04.2013 до 20.10.2013 пройдет 5 месяцев 39 дней. 
Теперь главный вопрос: 39 дней надо как-то перевести в месяцы, какое количество дней брать? 30 дней, как в начальном месяце или 31, как в конечном месяце? есть ли какое-то правило или соглашение?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.04.2013, 13:48
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Octane
			
		
	 | 
 
	| 
		есть ли какое-то правило или соглашение?
	 | 
 
	
 
 насчёт соглашения незнаю ... но была тема  тут 
	
 
	| 
		
			Сообщение от Octane
			
		
	 | 
 
	| 
		Например, с 10.04.2013 до 20.10.2013 пройдет 5 месяцев 39 дней.
	 | 
 
	
 
 по моему алгоритму получается 6 месяцев 10 дней
 
function passed(d, m, g, dd, mm, gg) {
    //устанавливаем начальное время  и  будушее
    var a = new Date(g, m - 1, d, 0, 0, 0, 0),b = new Date(gg, mm-1, dd, 0, 0, 0, 0);
    //увеличивая начальное время на 1 месяц вперёд
    //подсчитываем количество полных месяцев до сегодня
    //если дата превышает число дней следующего месяца
    //то месяцем считаем весь следующий  месяц
    //5 января + 1 месяц = 5 февраля, но 31 января + 1 месяц = 28/29 февраля
    for (m = 0;; m++) {
        g = new Date(a.getFullYear(), a.getMonth() + 2, 0);
        g.getDate() > d && g.setDate(d);
        if (g > b) break;
        a = g
    }
    d = b - a;//оставшееся время за последний неполный месяц, если будет
    d = Math.round(d/864E5);//количество полных дней в этом времени
    g = Math.floor(m/12);//сколько полных лет в подсчитанных месяцах
    m = m % 12;//оставшиеся месяцы от полных лет
    return [g, m, d]
};
alert(passed('10','4','2013','20','10','2013'));
 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.04.2013, 15:25
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 junior 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.11.2011 
					
					
					
						Сообщений: 3,924
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от рони
			
		
	 | 
 
	| 
		по моему алгоритму получается 6 месяцев 10 дней
	 | 
 
	
 
 ради интереса посмотрел функцию php  date_diff. Результат как у  рони.
 
$datetime1 = date_create('2013-04-10');
$datetime2 = date_create('2013-10-20');
$interval = date_diff($datetime1, $datetime2);
echo print_r( $interval );
выхлоп
 
DateInterval Object
(
    [y] => 0
    [m] => 6
    [d] => 10
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 193
)
 
		
	
		
		
		
		
		
			
				__________________ 
				Чебурашка стал символом олимпийских игр. А чего достиг ты? 
Тишина - самый громкий звук
			 
		
		
		
		
		
						  
				
				Последний раз редактировалось nerv_, 17.04.2013 в 15:33.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.04.2013, 16:37
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 junior 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.11.2011 
					
					
					
						Сообщений: 3,924
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		особо не проверял, вроде работает 
function dateDiff( date1, date2 ) {
	var years = date2.getFullYear() - date1.getFullYear();
	var months = years * 12 + date2.getMonth() - date1.getMonth();
	var days = date2.getDate() - date1.getDate();  
	
	years -= date2.getMonth() < date1.getMonth();
	months -= date2.getDate() < date1.getDate();
	days += days < 0 ? new Date( date2.getFullYear(), date2.getMonth() - 1, 0 ).getDate() + 1 : 0;
	
	return [ years, months, days ];
}
alert( dateDiff( new Date( '2013-11-10' ), new Date( '2014-01-09' ) ) );
alert( dateDiff( new Date( '2013-04-10' ), new Date( '2013-10-20' ) ) );
 
		
	
		
		
		
		
		
			
				__________________ 
				Чебурашка стал символом олимпийских игр. А чего достиг ты? 
Тишина - самый громкий звук
			 
		
		
		
		
		
						  
				
				Последний раз редактировалось nerv_, 17.04.2013 в 17:09.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.04.2013, 19:24
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 junior 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.11.2011 
					
					
					
						Сообщений: 3,924
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		вариант #2 
function dateDiff( date1, date2 ) {
	date1 = new Date( date1 );
	date2 = new Date( date2 );
	
	var milliseconds = date2.getMilliseconds() - date1.getMilliseconds();
	
	if ( milliseconds < 0 ) {
		milliseconds += 1000;
		date2.setSeconds( date2.getSeconds() - 1 );
	}
	
	var seconds = date2.getSeconds() - date1.getSeconds();
	
	if ( seconds < 0 ) {
		seconds += 60;
		date2.setMinutes( date2.getMinutes() - 1 );
	}
		
	var minutes = date2.getMinutes() - date1.getMinutes();
	
	if ( minutes < 0 ) {
		minutes += 60;
		date2.setHours( date2.getHours() - 1 );
	}
	
	var hours = date2.getHours() - date1.getHours();
	
	if ( hours < 0 ) {
		hours += 24;
		date2.setDate( date2.getDate() - 1 );
	}
	
	var days = date2.getDate() - date1.getDate();
	
	if ( days < 0 ) {
		days += new Date( date2.getFullYear(), date2.getMonth() - 1, 0 ).getDate() + 1;
		date2.setMonth( date2.getMonth() - 1 );
	}
	
	var months = date2.getMonth() - date1.getMonth();
	
	if ( months < 0 ) {
		months += 12;
		date2.setFullYear( date2.getFullYear() - 1 );
	}
	
	var years = date2.getFullYear() - date1.getFullYear();
	
	return [ years, months, days, hours, minutes, seconds, milliseconds ];
}
alert( dateDiff( '2013-01-10 00:10', '2013-01-11 00:09' ) );
alert( dateDiff( '2013-04-10', '2013-10-20' ) );
 
		
	
		
		
		
		
		
			
				__________________ 
				Чебурашка стал символом олимпийских игр. А чего достиг ты? 
Тишина - самый громкий звук
			 
		
		
		
		
		
						  
				
				Последний раз редактировалось nerv_, 17.04.2013 в 19:30.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.04.2013, 21:00
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.12.2009 
					
					
					
						Сообщений: 155
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Особого смысла считать разницу в интервалах больших чем сутки нет по причине непостоянства количества дней в этих интервалах (в месяцах и годах). Хотя для удобства же представления можно сделать, например, так: 
var S = 60 * 60 * 24 * 1000;
var diff2 = function(date1, date2)
{
	var delta = date1.getDate() - 1;
	var date3 = new Date(date1.getFullYear(), date1.getMonth(), 1);
	var date4 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate() - delta);
	var m = date4.getMonth() - date3.getMonth();
	var d = date4.getDate() - 1;
	alert([
		date1, date2, (date4 - date3) / S, 
		date3, date4, (date2 - date1) / S, 
		'months: ' + m, 'days: ' + d
	].join('\n'));
};
var x = new Date(2013, 3, 10);
var y = new Date(2013, 9, 20);
diff2(x, y);
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось with-love-from-siberia, 17.04.2013 в 21:06.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.04.2013, 10:52
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 12.12.2012 
					
					
					
						Сообщений: 1,398
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 У меня есть вопрос, по похожей проблеме. Есть 2 даты (строки в формате день.месяц.год часы:минуты:секунды), нужно посчитать количество часов и минут между этими датами 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.04.2013, 12:08
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 12.12.2012 
					
					
					
						Сообщений: 1,398
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
var date1 = new Date('10.05.12 16:30'); 
var date2 = new Date('10.05.13 15:20'); 
var delta = date2-date1; 
var hours = Math.round(delta / (60*60*1000)); 
var minutes = (delta-hours*60*60*1000) / (60*1000); 
alert(hours + ' ' + minutes);
Так?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.04.2013, 12:29
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.02.2011 
					
					
					
						Сообщений: 351
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Используя round рискуете получить отрицательное количество минут, напр: 4 часа -25 минут вместо 3 часа 35 минут 
var minutes = Math.round(delta / (60*1000));
var hours = Math.floor( minutes / 60 );
minutes -= hours * 60;
  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось rgl, 22.04.2013 в 12:34.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.04.2013, 12:41
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 12.12.2012 
					
					
					
						Сообщений: 1,398
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
var date1 = new Date('10.05.12 14:30');
    var date2 = new Date('10.05.12 15:20');
    var delta = date2-date1;
    var minutes = Math.round(delta / (60*1000));
    var hours = Math.floor(minutes / 60);
    minutes -= (hours * 60);
    alert(hours + ' ' + minutes);
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось tsigel, 22.04.2013 в 12:44.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |