Вопрос
Как получить разницу двух дат в формате: лет, месяцев, дней
В общем случае, данный вопрос не имеет решения.
Пожалуйста, не надо сразу бросаться писать опровержения, что вот у меня есть готовый код, который это делает или вот есть ссылка на решение. Сначала дочитайте до конца, что именно подразумевается в данном случае под фразой "решения не имеет".
Проблема заключается в том, что нет однозначного определения того, что есть "месяц" и "год". Как правило, под этим подразумевают календарные месяцы. Но сложность в том, что календарный месяц - это понятие не абсолютное, а относительное. Календарный месяц - это не просто некоторое количество дней. Это количество дней, прошедших с определенной даты.
Для лучшего понимания проблемы рассмотрим простой пример.
Надо определить разницу дат между 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 дня.
Школы
Составьте алгоритм определения числа дней между двумя датами и нарисуйте блок-схему. пожалуйста срочно!!!
Похожие вопросы
- Помогите составить алгоритм по информатике!!
- Блок-схема, 7 класс.
- ПОЖАЛУЙСТА СРОЧНО СРОЧНО СРОЧНО ПОМОГИТЕ ПОЖАЛУЙСТА СРОЧНО ПОЖАЛУЙСТА С СОЧИНЕНИЕМ СРОЧНО ПОЖАЛУЙСТА.
- помогите пожалуйста!!! срочно нужно: ) (география) составьте характеристику мировой угольной промышленности
- Пожалуйста срочно нужно составить таблицу по истории 7 класс Деятели Культуры Эпохи Возрождения
- составьте в тетради план на тему Причины освободительной борьбы Нидерландов против Испании .ЛЮДИ СРОЧНО НАПИШИТЕ ПОЖАЛУЙ
- в чём сходство и в чём различие между простыми и сложными предложениями? при ответе используй схемы предложения. срочно!
- составьте рассказ "Столетняя война"по плану: А) дата; Б) цели; В) участники; Г) итоги.
- Помогите составить сочинение на тему Образ Петра 1 и Карла 12 в поэме "Полтава" срочно!
- помогите составить сказку на тему: "Почему шипящие не дружат с гласными ы, ю, я? " (СРОЧНО) "