|
Вопрос # 782/ вопрос открыт / |
|
Не могу придумать алгоритм программы, которая бы считала количество полных лет, месяцев и дней между двумя датами. Все перебрал, висну.
Весь алгоритм не нужен, намекните суть.
 |
Вопрос задал: Вадим1979 (статус: Посетитель)
Вопрос отправлен: 24 июля 2007, 11:41
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Вадим!
Вообще то есть стандартная функция. Обявленна она в юните DateUtils и называется DaysBetween
Но если интересна техническая сторона вопроса, тогда так. заменим задачу поиска разности немного другой. Поиска разности между заданной датой и какой-то фиксированной. Можно показать, что если мы знаем разницу между первой датой(Д1) и фиксированной(Ф) и второй датой(Д2) и фиксированной, то разница между первой и второй легко считается по формуле Д2-Д1 (Только надо с знаком определиться.)
Теперь задача просто видоизменилась. Осталось научиться считать кол-во дней с какой то фиксированной даты. Для упрощения расчётов возьмём 1января 1900 года (хотя если у вас даты будут только после 2000, то можно и 1 января 2000 года). Теперь, кол-во дней будем считать по кусочкам.давайте посчитаем на примере текущей даты - 24.07.2007
вначале по годам.
(2007-1900) = 107 год. с них высокосных - 107 div 4 =26. Поэтому 107*365+26 = 39081 (можно делать и проще - множить кол-во год на 365,25). также не забываем, что 1900 не есть высокосным (все года, которые делятся нацело на 100, но не делятся на 400 высокосными не являются!)
теперь по месяцам
сейчас 7 месяц. Составив массив с 12 чисел вида [0,31,31+28,31+28+31.....]
можно посчитать, что с начала года прошло 180 дней (если я не ошибся)
и для дня - сегодня 24 день.
Итого 39285.
посчитав для другой даты, можно быстро посчитать разницу между днями
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 24 июля 2007, 12:02
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 10; последнее сообщение — 25 июля 2007, 09:18; участников в обсуждении: 3.
|
Аксион (статус: 4-ый класс), 24 июля 2007, 11:51 [#1]:
Вообще я делал такую прогу, но на QBasic, щас её поищу -может чем помогу
|
|
Вадим1979 (статус: Посетитель), 24 июля 2007, 12:23 [#2]:
Буду благодарен
|
|
Аксион (статус: 4-ый класс), 24 июля 2007, 13:11 [#3]:
К СОЖЕЛЕНИЮ ПРОГУ НЕ НАШЁЛ, а да тут уже Вадим К всё обьяснил (но на всякий это можно сделать с помощью компонента calendar)
|
|
Вадим1979 (статус: Посетитель), 24 июля 2007, 13:22 [#4]:
Есть ICQ?
|
|
Аксион (статус: 4-ый класс), 24 июля 2007, 13:29 [#5]:
Вы у меня про ICQ спрашивали?ICQ нет - я через интернет общатся не люблю
|
|
Вадим1979 (статус: Посетитель), 24 июля 2007, 13:50 [#6]:
Да, у Вас.
Ответ у Вадима К полный, но что я его не совсем догнал, есть мнение, что жара плавит мозг.
Если есть мысль как посчить по другому, напиши буду благодарен.
Задача такая:
Пример: Между 01.03.2000 и 02.04.2005 - 5 лет, 1 месяц и 1 день. (возраст, стаж ит.д. так определяется).
Даты могут изменяться. Прямое вычитание не ответ.
|
|
Аксион (статус: 4-ый класс), 24 июля 2007, 13:57 [#7]:
Я попробую чтонибудь сделать, но получится или нет сказать не могу.
|
|
Вадим К (статус: Академик), 24 июля 2007, 13:58 [#8]:
как раз прямое вычитание в столбик и есть ответ.
Только записать правильно надо
2005 04 02
-
2000 03 01
=----------------------
0005 01 01
возможен и другой случай
2005 04 02
-
2000 05 01
=----------------------
0004 11 01
В этом случае месяц получается отрицательным. поэтому "одалживаем" один год и дробим на 12 месяцев. итого у нас их 12+4 = 16. теперь всё вычитается.
Всё это хорошо автоматизируется.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Аксион (статус: 4-ый класс), 24 июля 2007, 14:28 [#9]:
Мдааа трудная задачка если честно то я не знаю пытался сделать с помощью DaysBetween, MonthsBetween, YearsBetween
- но пулучалось выщитать разницу только дней, а MonthsBetween, YearsBetween всегда показывали 0 и если чесно ответ Вадима К. меня запутал .Да и я вспомнил что делала та программа на QBasic ике она высчитавала сколько дней, месяцев до следующего дня рождения - жаль что я её не нашёл.
|
|
Вадим1979 (статус: Посетитель), 25 июля 2007, 09:18 [#10]:
Что бы решить задачу надо было выключить компьютер и поесть.
В принципе, я думаю, что нашел алгоритм, но он большой и какой-то мудреный. Пока тестирую эту чать, вроде без ошибок, а там видно будет. Но, если честно, то, что нашел не нравится самому.
Последний пример Вадима К с прямым вычитанием я пробовал, но где-то завис (может жара), по этому отказался от него.
Но вообще-то думаю, что векторная направленность верная, надо только реализовать.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|