gifts2017

Разность дат прописью

Опубликовал Yurkiss (Yurkiss) в раздел Программирование - Практика программирования

Функция РазностьДатПрописью(Дата1, Дата2), которая возвращает разность между двумя датами прописью в виде 1 год 12 месяцев 3 дня 10 часов 6 минут 12 секунд.

Сделано на базе http://help1c.com/faq/view/679.html

Я добавил часы, минуты и секунды.

Функция РазностьДатПрописью(Дата1, Дата2)	
	Лет = 0; Мес = 0; Дн = 0;	
	Часов = 0; Минут = 0; Секунд = 0;
	РазобратьРазностьДат(Дата1, Дата2, Лет, Мес, Дн, Часов, Минут, Секунд);
	ЛетС = ФормаМножественногоЧисла("год","года","лет",Лет);	
	МесС = ФормаМножественногоЧисла("месяц","месяца","месяцев",Мес);
	ДнС = ФормаМножественногоЧисла("день","дня","дней",Дн);
	ЧасовС = ФормаМножественногоЧисла("час","часа","часов", Часов);
	МинутС = ФормаМножественногоЧисла("минута","минуты","минут", Минут);
	СекундС = ФормаМножественногоЧисла("секунда","секунды",	"секунд", Секунд);	
	Рез = 
	?(Лет > 0, Строка(Лет) + " " + ЛетС, "") + " " +
	?(Мес > 0, Строка(Мес) + " " + МесС, "") + " " +
	?(Дн > 0, Строка(Дн) + " " + ДнС, "") + " " +
	?(Часов > 0, Строка(Часов) + " " + ЧасовС, "") + " " +
	?(Минут > 0, Строка(Минут) + " " + МинутС, "") + " " +
	?(Секунд > 0, Строка(Секунд) + " " + СекундС, "");	
	Возврат Рез;
КонецФункции 
// Назначение: Получить разность дат.
// Данные разности возвращаются в переменные Лет, Мес, Дн, Часов, Минут, Секунд.
// Порядок дат не имеет значения.
Процедура РазобратьРазностьДат(ПолнаяДата1, ПолнаяДата2, Лет = 0, Месяцев = 0, Дней = 0, Часов = 0, Минут = 0, Секунд = 0)
	Лет	= 0;
	Месяцев	= 0;
	Дней	= 0;	
	Дата1 = Макс(НачалоДня(ПолнаяДата1), НачалоДня(ПолнаяДата2));
	Дата2 = Мин(НачалоДня(ПолнаяДата1), НачалоДня(ПолнаяДата2));	
	Если Дата1 > Дата2 Тогда		
		ВременнаяДата = Дата1;
		Если День(ВременнаяДата) < День(Дата2) Тогда
			Дней = (ВременнаяДата - ДобавитьМесяц(ВременнаяДата,-1))/86400;
			ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
		КонецЕсли;
		Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
			ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
			Месяцев = 12;
		КонецЕсли;
		Лет		= Макс(Год(ВременнаяДата) - Год(Дата2), 0);
		Месяцев	= Макс(Месяцев	+ Месяц(ВременнаяДата)- Месяц(Дата2), 0);
		Дней	= Макс(Дней + День(ВременнаяДата) - День(Дата2), 0);		
		// скорректируем отображаемое значение, если ""вмешалось"" разное количество дней в месяцах
		Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет * 12-Месяцев)-Дней * 86400) Тогда
			Дней = Дней + (День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
		КонецЕсли;		
	КонецЕсли;	
	//Приводим даты к одному дню, чтобы посчитать разность в секундах одного дня
	Дата1 = Дата(Год(ПолнаяДата2), Месяц(ПолнаяДата2), День(ПолнаяДата2), Час(ПолнаяДата1), Минута(ПолнаяДата1), Секунда(ПолнаяДата1));
	Дата2 = ПолнаяДата2;	
	Разность = Макс(Дата1, Дата2) - Мин(Дата1, Дата2);	
	Часов = Цел(Разность / 3600);
	Минут = Цел( (Разность - Часов * 3600) / 60 );
	Секунд = Окр( ( (Разность - Часов * 3600) / 60 - Минут ) * 60, 2);		
КонецПроцедуры

// Сформировать множественное число
Функция ФормаМножественногоЧисла(Слово1, Слово2, Слово3, Знач ЦелоеЧисло)	
	// Изменим знак целого числа, иначе отрицательные числа будут неправильно преобразовываться
	Если ЦелоеЧисло < 0 Тогда
		ЦелоеЧисло = -1 * ЦелоеЧисло;
	КонецЕсли;	
	Если ЦелоеЧисло <> Цел(ЦелоеЧисло) Тогда // для нецелых чисел - всегда вторая форма
		Возврат Слово2;
	КонецЕсли;	
	// остаток
	Остаток = ЦелоеЧисло % 10;
	Если (ЦелоеЧисло > 10) И (ЦелоеЧисло < 20) Тогда
		// для второго десятка - всегда третья форма
		Возврат Слово3;
	ИначеЕсли Остаток = 1 Тогда
		Возврат Слово1;
	ИначеЕсли (Остаток > 1) И (Остаток < 5) Тогда
		Возврат Слово2;
	Иначе
		Возврат Слово3;
	КонецЕсли;
КонецФункции

Пример использования:

Сообщить(РазностьДатПрописью(Дата(2009, 12, 31), ТекущаяДата()));

Порядок указания дат не имеет значения.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сергей Куликов (ksvd) 23.10.13 17:30
Спасибо. Может пригодиться
2. Петр (peterxx) 24.10.13 08:06
Спасибо. Присоединяюсь.
3. Марина Чирина (chmv) 24.10.13 08:56
а проще нельзя. Найти разность и сумма прописью
4. Yurkiss (Yurkiss) 24.10.13 11:49
(3) chmv,
Если так:
СекундС = ЧислоПрописью(Секунд, "", "секунда, секунды, секунд, м, секунда, секунды, секунд, ж, 0");

то получается Девять секунд, а хочется 9 секунд