Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2016, 16:01   #1
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию Узнать точное количество месяцев и дней между датами

Господа программисты, прошу Вашей помощи. Уже второй день вожусь. Нужно узнать количество месяцев и дней между двумя датами. Сам набросал такой код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
from_date, to_date:TDate;
days, days_fm, days_left:integer;
Full_months:String;

begin
from_date:=DateTimePicker1.DateTime;
to_date:=DateTimePicker2.DateTime;

//Всего дней между двумя датами
Days:=DaysBetween(from_date, to_date);

//Полных месяцев между двумя датами
Full_Months:=IntToStr(Trunc(Days/30.4375));

//Количество дней в полных месяцах
days_fm:=Round(30.4375*strToInt(Full_Months));

//Остаток дней
days_left:=Days-Days_fm;

Edit1.Text:=Full_months;
Edit2.Text:=inttostr(days);
Edit3.Text:=inttostr(days_left);
end;
Но дело в том, что я здесь использую усредненное число дней в месяце 30.4375, а мне необходимо вычислить точное количество с учетом февраля 28-29 дней и остальных месяцев 30-31 день.

Подскажите, может кто-то уже решал для себя такую задачу?
Dux вне форума Ответить с цитированием
Старый 12.03.2016, 16:39   #2
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
from_date, to_date:TDate;
days,Full_months:integer;
d1,d2,m1,m2,y1,y2:word;
begin
from_date:=DateTimePicker1.DateTime;
to_date:=DateTimePicker2.DateTime;

Days:=Round(from_date-to_date);

DecodeDate(from_date,y1,m1,d1);
DecodeDate(to_date,y2,m2,d2);
Full_Months:=(y1-y2)*12+(m1-m2);

Edit1.Text:=inttostr(Full_months);
Edit2.Text:=inttostr(days);
end;
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 12.03.2016, 16:44   #3
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

К сожалению не работает. Если ввести даты

29.02.2016 и 12.03.2016

Выдает результат: месяцев "-1", дней "-12"

Во-первых почему-то с минусом, во вторых неправильно.
Dux вне форума Ответить с цитированием
Старый 12.03.2016, 16:46   #4
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

А если наоборот поставить переменные:
Код:
to_date:=DateTimePicker1.DateTime;
from_date:=DateTimePicker2.DateTime;
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
from_date, to_date:TDate;
days,Full_months:integer;
d1,d2,m1,m2,y1,y2:word;
begin
to_date:=DateTimePicker1.DateTime;
from_date:=DateTimePicker2.DateTime;

Days:=Round(from_date-to_date);

DecodeDate(from_date,y1,m1,d1);
DecodeDate(to_date,y2,m2,d2);
Full_Months:=(y1-y2)*12+(m1-m2);
If d1<d2 then Full_Months:=Full_Months-1; // эта строчка необходима для вычисления ПОЛНЫХ месяцев

Edit1.Text:=inttostr(Full_months);
Edit2.Text:=inttostr(days);
end;
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]

Последний раз редактировалось newerow1989; 12.03.2016 в 16:48.
newerow1989 вне форума Ответить с цитированием
Старый 12.03.2016, 16:48   #5
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Цитата:
Сообщение от newerow1989 Посмотреть сообщение
А если наоборот поставить переменные:
Код:
to_date:=DateTimePicker1.DateTime;
from_date:=DateTimePicker2.DateTime;
Наоборот - только минус ушел, а результат все тот же - неправильный
Dux вне форума Ответить с цитированием
Старый 12.03.2016, 16:49   #6
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Я выше дополнил пост
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 12.03.2016, 16:50   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Dux, это на Пихе, по думаю - разберёшься.
Код:
// первый понедельник января 2011
echo compute_day(1, 1, 1, 2011); // 3
 */

function compute_day($weekNumber, $dayOfWeek, $monthNumber, $year)
{
    // порядковый номер дня недели первого дня месяца $monthNumber
    $dayOfWeekFirstDayOfMonth = date('w', mktime(0, 0, 0, $monthNumber, 1, $year));// 0 - воскресенье 6 - суббота 
    if($dayOfWeekFirstDayOfMonth == 0) $dayOfWeekFirstDayOfMonth = 7;  
 
    // сколько дней осталось до дня недели $dayOfWeek относительно дня недели $dayOfWeekFirstDayOfMonth
    $diference = 0;
 
    // если нужный день недели $dayOfWeek только наступит относительно дня недели $dayOfWeekFirstDayOfMonth
    if ($dayOfWeekFirstDayOfMonth <= $dayOfWeek) $diference = $dayOfWeek - $dayOfWeekFirstDayOfMonth;
    // если нужный день недели $dayOfWeek уже прошёл относительно дня недели $dayOfWeekFirstDayOfMonth
    else $diference = 7 - $dayOfWeekFirstDayOfMonth + $dayOfWeek;

    $month_number = array(31,28,31,31,31,30,31,31,30,31,30,31);// Массив дней в месяце
    // Проверяем високосный или не високосный год
    if(is_leap_year($year)) $month_number[1]+=1;// К февралю добавляем день
   
    $rez = 1 + $diference + ($weekNumber - 1) * 7;
    if($rez > $month_number[$monthNumber-1]) $rez = -1;    
    return $rez; 
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.03.2016, 16:51   #8
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Спасибо! но оказывается не так все просто

Если ввести даты:

12.02.2016 и 12.03.2016 программа выдает 1 месяц и 29 дней..
Dux вне форума Ответить с цитированием
Старый 12.03.2016, 16:52   #9
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Пожалуйста!

Smitt&Wesson, это раздел "Общие вопросы Delphi"
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 12.03.2016, 16:53   #10
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

К сожалению PHP не владею. Если Вас не затруднит, подсобите на дельфи
Dux вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Количество дней между датами (Delphi) TyTan Помощь студентам 14 15.12.2022 11:36
Как в MS Excel рассчитать количество полных месяцев между двумя датами? moonlightchild Microsoft Office Excel 2 28.12.2012 13:20
Даны a1,b1,c1, и a2,b2,c2 которые обозначают две даты. Нужно вычислить кол-во дней между этими датами Рафиль Паскаль, Turbo Pascal, PascalABC.NET 6 21.10.2011 10:34
С++: найти число дней между 2 датами kissel Помощь студентам 2 15.03.2009 17:18