Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.04.2013, 13:21
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 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, как в конечном месяце? есть ли какое-то правило или соглашение?
Ответить с цитированием
  #2 (permalink)  
Старый 16.04.2013, 13:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от 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'));
Ответить с цитированием
  #3 (permalink)  
Старый 17.04.2013, 15:25
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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.
Ответить с цитированием
  #4 (permalink)  
Старый 17.04.2013, 16:37
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 17.04.2013, 19:24
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 17.04.2013, 21:00
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 22.04.2013, 10:52
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

У меня есть вопрос, по похожей проблеме. Есть 2 даты (строки в формате день.месяц.год часы:минуты:секунды), нужно посчитать количество часов и минут между этими датами
Ответить с цитированием
  #8 (permalink)  
Старый 22.04.2013, 12:08
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 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);

Так?
Ответить с цитированием
  #9 (permalink)  
Старый 22.04.2013, 12:29
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Используя 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.
Ответить с цитированием
  #10 (permalink)  
Старый 22.04.2013, 12:41
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 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.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разница между датами liarbur Общие вопросы Javascript 6 04.04.2013 15:20
Разница между датами при onchange Ptichka Events/DOM/Window 0 06.04.2012 18:10
Разница между датами Amour Общие вопросы Javascript 4 29.03.2011 21:01
Разница между датами в днях autosoft Общие вопросы Javascript 2 01.06.2010 19:23
Скрытие курсора через промежуток времени najrobi Internet Explorer 5 02.07.2009 16:32