HelpF.pro

Как получить количество ЛЕТ, МЕСЯЦЕВ, ДНЕЙ между датами?

Нужно получить разницу между датами 31.12.2009 и 10.01.2005 и отобразить ее как: 4 года 11 месяцев 21 день
Код 1C v 8.х
 Процедура ТЕСТ_ВыполнитьНажатие(Кнопка)
ДатаНач = Дата(2009, 12, 31);
ДатаКон = Дата(2005, 1, 10);
Лет=0; Мес=0; Дн=0;
РазобратьРазностьДат(ДатаНач, ДатаКон, Лет, Мес, Дн);
ЛетС = ФормаМножественногоЧисла("год","года","лет",Лет);
МесС = ФормаМножественногоЧисла("месяц","месяца","месяцев",Мес);
ДнС = ФормаМножественногоЧисла("день","дня","дней",Дн);
Сообщить(?(Лет>0,Строка(Лет)+" "+ЛетС,"")+" "+?(Мес>0,Строка(Мес)+" "+МесС,"")+" "+Строка(дн)+" "+ДнС);
// Результат будет : 4 года 11 месяцев 21 день

КонецПроцедуры

// Получить разность дат
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0)
Лет = 0;
Месяцев = 0;
Дней = 0;
Если Дата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, Слово3, Знач ЦелоеЧисло)

// Изменим знак целого числа, иначе отрицательные числа будут неправильно преобразовываться
Если ЦелоеЧисло < 0 Тогда
ЦелоеЧисло = -1 * ЦелоеЧисло;
КонецЕсли;

Если ЦелоеЧисло <> Цел(ЦелоеЧисло) Тогда
// для нецелых чисел - всегда вторая форма
Возврат Слово2;
КонецЕсли;

// остаток
Остаток = ЦелоеЧисло%10;
Если (ЦелоеЧисло >10) И (ЦелоеЧисло<20) Тогда
// для второго десятка - всегда третья форма
Возврат Слово3;
ИначеЕсли Остаток=1 Тогда
Возврат Слово1;
ИначеЕсли (Остаток>1) И (Остаток<5) Тогда
Возврат Слово2;
Иначе
Возврат Слово3;
КонецЕсли;

КонецФункции

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq8/view/679.html