|
Учебный код: количество дней до/ после дня рождения | ☑ | ||
---|---|---|---|---|
0
KeyAsk
30.09.23
✎
18:07
|
По заданию нужно написать код, который выдаёт результат количества дней до/ после дня рождения, если до/ после дня рождения менее 5 дней.
Прошу помочь идеями как сделать это с минимальными ресурсами и объёмом кода. Видел несколько реализаций, но все они содержат ошибки: - не обрабатывается корректно день рождения 29.02 - не верные результаты в количестве дней, когда день рождения и контрольная ("текущая") дата приходятся рядом со точкой перемены года Вот так решил задачу. Кому пригодится - на здоровье. Будет интересно посмотреть а можно ли её решить более эффективно и менее громоздким кодом? (с учётом сохранения всех нюансов функционала) &НаКлиенте Асинх Процедура ПолучениеДанныхАсинх() Имя = Ждать ВвестиСтрокуАсинх(Имя, "Как твоё имя?"); ДатаРождения = Ждать ВвестиДатуАсинх(ДатаРождения, "Укажи дату рождения?", ЧастиДаты.Дата); КонтрольнаяДата = ТекущаяДата(); //Строка для тестирования //КонтрольнаяДата = '2023.12.31 21:23:10'; ДатаРождения = КонецДня(ДатаРождения); Сегодня = КонецДня(КонтрольнаяДата); ГодСегодня = Год(ТекущаяДата()); ДеньРождения = День(ДатаРождения); МесяцРождения = Месяц (ДатаРождения); //Упрощённый режим отработки високосного года Если МесяцРождения=2 И ДеньРождения=29 Тогда ДеньРождения = 28; КонецЕсли; ДеньРожденияСейчас = КонецДня(Дата(ГодСегодня, МесяцРождения, ДеньРождения)); ДеньРожденияПредыдущий = КонецДня(Дата(ГодСегодня-1, МесяцРождения, ДеньРождения)); ДеньРожденияСледующий = КонецДня(Дата(ГодСегодня+1, МесяцРождения, ДеньРождения)); Дистанция = Мин(Sqrt(Pow(ДеньРожденияСейчас-Сегодня,2)), Sqrt(Pow(ДеньРожденияПредыдущий-Сегодня,2)), Sqrt(Pow(ДеньРожденияСледующий-Сегодня,2))); Если Дистанция=Sqrt(Pow(ДеньРожденияСейчас-Сегодня,2)) Тогда РасчётнаяДата = ДеньРожденияСейчас; ИначеЕсли Дистанция=Sqrt(Pow(ДеньРожденияПредыдущий-Сегодня,2)) Тогда РасчётнаяДата = ДеньРожденияПредыдущий; ИначеЕсли Дистанция=Sqrt(Pow(ДеньРожденияСледующий-Сегодня,2)) Тогда РасчётнаяДата = ДеньРожденияСледующий; КонецЕсли; Сообщить("№15. Как тебя зовут:"); Сообщить("Сегодня: "+КонтрольнаяДата+". Твой ближайший день рождения: "+РасчётнаяДата); Если (РасчётнаяДата-Сегодня <= 86400*5) И (РасчётнаяДата-Сегодня > 0) Тогда Сообщить("Хорошо проверсти день рождения, "+Имя+"!"); ИначеЕсли (РасчётнаяДата-Сегодня >= -86400*5) И (РасчётнаяДата-Сегодня < 0) Тогда Сообщить("Хорошо ли прошёл день рождения, "+Имя+"?"); ИначеЕсли РасчётнаяДата-Сегодня = 0 Тогда Сообщить("С днём рождения, "+Имя+"!"); Иначе Сообщить("Рад видеть, "+Имя+"!"); КонецЕсли; |
|||
1
vde69
30.09.23
✎
18:30
|
дней = мод(дата(началодня(текущаядата()-началодня(деньрождения))));
сообщить (дней); ну а дальше условия наворачивай на количество этих самых дней.... |
|||
2
АНДР
01.10.23
✎
07:48
|
(1) Люди так долго не живут. :) Дней надо поделить на количество секунд в сутках.
P.S. Знак нужен для определения до или после. На -1 домножать при выводе в "отрицательной" ветке. P.P.S. Второе начало дня - не нужно, состав даты - день. |
|||
3
Волшебник
01.10.23
✎
07:54
|
ошибка в слове "проверсти"
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |