Школы

Составьте алгоритм определения числа дней между двумя датами и нарисуйте блок-схему. пожалуйста срочно!!!

Роза С
Роза С
140
Вопрос

Как получить разницу двух дат в формате: лет, месяцев, дней

В общем случае, данный вопрос не имеет решения.
Пожалуйста, не надо сразу бросаться писать опровержения, что вот у меня есть готовый код, который это делает или вот есть ссылка на решение. Сначала дочитайте до конца, что именно подразумевается в данном случае под фразой "решения не имеет".
Проблема заключается в том, что нет однозначного определения того, что есть "месяц" и "год". Как правило, под этим подразумевают календарные месяцы. Но сложность в том, что календарный месяц - это понятие не абсолютное, а относительное. Календарный месяц - это не просто некоторое количество дней. Это количество дней, прошедших с определенной даты.
Для лучшего понимания проблемы рассмотрим простой пример.
Надо определить разницу дат между 30 января и 2 апреля одного 2008 года.
Если бы задача заключалась в определении количества дней, то все решалось бы простым вычитанием

?{^2008-04-02} - {^2008-01-30} && 63 дня

А как определить количество месяцев? Результат будет существенно зависеть от того, как именно будет определяться один месяц. Возможно несколько идеологий расчета:

Вариант 1
Прибавляем к начальной дате последовательно по одному месяцу до тех пор, пока результат не превысит конечной даты.
Под термином "месяц" в процессе прибавления подразумевается такая операция, в результате которой номер дня остается тот же самый, а номер месяца увеличивается на 1. Если у нового месяца нет такой даты, то устанавливается дата равная последнему дню нового месяца. Так работает функция GoMonth()
Это значит, что если прибавить один месяц к 30 января, то получим 29 февраля (2008 год - високосный), поскольку в феврале нет 30 числа.
Затем прибавляем к 29 февраля еще один месяц, получаем 29 марта. Прибавлять еще один месяц уже не надо, поскольку результат будет заведомо больше 2 апреля.
Между 29 марта и 2 апреля остается 4 дня. Значит, результат будет 2 месяца и 4 дня.
Заметьте, что в не високосном году результат был бы 2 месяца и 5 дней
Обратите внимание на тот факт, что если начальная дата равна 29, 30 или 31 января результат был бы один и тот же! Поскольку прибавление одного месяца давало бы все то же 29 февраля. Получается парадоксальная ситуация - количество дней разное, а результат одинаковый.

Вариант 2
Алгоритм похож на "Вариант 1", но прибавлять будем не по одному месяцу за раз, а сразу прибавим столько месяцев, чтобы оказаться как можно ближе к конечной дате. Т. е. прибавим к 30 января сразу 2 месяца и получим 30 марта.
Между 30 марта и 2 апреля остается 3 дня. Значит, результат будет 2 месяца и 3 дня.
Заметьте, что если бы конечным месяцем был бы не апрель, а март, то данный вариант расчета ничем не отличался бы от "Варианта 1".

Вариант 3
Под термином "месяц" будем понимать именно календарный месяц. Т. е. февраль - это интервал от 01 февраля до 29 февраля, март - это интервал от 01 марта до 31 марта.
В этом случае имеем 2 полных месяца - февраль и март. И "остатки" от граничных месяцев: 1 день до конца января и 2 дня апреля. Значит, результат будет 2 месяца и 3 дня.
Но в данном случае повезло. Оставшихся дней явно не хватает для полного месяца. А если бы оставшихся дней было бы, например, 40 (с 10 января по 20 апреля)? Встал бы вопрос, сколько дней надо выделить из этого количества дней, чтобы получить еще 1 месяц? Берем количество дней в январе (месяце начала периода) или в апреле (месяце конца периода)?

Вариант 4
Принимаем, что все месяцы имеют одинаковое количество дней, которое вычисляется по следующей формуле:
(365+365+365+366)/4/12 = 30.4375
Тогда количество месяцев - это просто отношение количества дней к данной константе, округленное до целого. Значит, результат будет 2 месяца и 2 дня.
ЛУ
Людмила Урекяну
63 228
Лучший ответ

Похожие вопросы