Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.02;
Скачать: CL | DM;

Вниз

Расчет количества дней между двумя датами   Найти похожие ветки 

 
Бугага ©   (2006-03-12 04:30) [0]

Необходимо рассчитать количество дней между двумя датами, причем:
необходимо указать, что эта разность состоит из:
... месяцев,
... неделей,
... выходных дней (в том числе и праздники),
... будничных дней.

Может, у кого есть подобный алгоритм?
Где можно взять все наши праздники?


 
lookin ©   (2006-03-12 04:41) [1]

Здесь взять праздники практически нереально, постокльку поскольку тут все их празднуют....


 
grisme ©   (2006-03-12 04:47) [2]

> Необходимо рассчитать количество дней между двумя датами
Дата типа TDate - число float. Попробуй присвой real-переменным соответствующие даты. Найди разность - вот и число дней.:)


 
Бугага ©   (2006-03-12 04:50) [3]

> Найди разность - вот и число дней.:)

Да это то без проблем... Вопрос то не в этом... Как узнать, что в этих 24 днях - 6 выходных и 3 праздника (?)

> Здесь взять праздники практически нереально, постокльку поскольку тут все их празднуют....

Ну, это то понятно... Поэтому и должны помнить праздники :) Хотя бы первые числа :)


 
grisme ©   (2006-03-12 05:02) [4]

С выходными должно быть попроще, а вот праздники...:)

> Как узнать, что в этих 24 днях - 6 выходных и 3 праздника
> (?)

Как,как...Сделай цикл от одной даты до другой и сделай че-то типа if (dow=суббота) or (dow=воскресенье) then vih:=vih+1;)


 
Бугага ©   (2006-03-12 05:30) [5]

А праздники?

if (dow=праздник) ?


 
grisme ©   (2006-03-12 05:37) [6]

:)))
нет с праздником просто сравнивай даты(переводя в строки).


 
Sergey Masloff   (2006-03-12 09:25) [7]

1) Праздники берутся из производственного календаря на соответствующий год.
2) Считаешь число дней между двумя датами и выходных между двумя датами
3) Про недели и месяцы я вообще не понимаю в чем трудности.


 
Anatoly Podgoretsky ©   (2006-03-12 11:28) [8]

Sergey Masloff   (12.03.06 09:25) [7]
А я понимаю - про месяцы


 
TStas ©   (2006-03-12 12:09) [9]

Выходные просто совсем. У первой даты находим ближайший выходной и прибавляем по 7, пока не станет больше второй. Естественно, увеличиваем при этом счетчик. С буднями и целыми месяцами все вообще просто. А вот с праздниками... Мне в голову приходит только массив прздников составлять.


 
sniknik ©   (2006-03-12 12:17) [10]

> 3) Про недели и месяцы я вообще не понимаю в чем трудности.
допустим разница получилась 30 дней, это сколько -
1: месяц ровно
2: месяц без одного дня т.е. так и осталось 30 дней
3: месяц и 2 дня.
???

если считать только прошедшие целиком то не будут ли странными такие результаты расчетов - 1 месяц и 55 дней? (с началных дней первого до конечных третьего)
человек не поймет сразу. а любое непонимание трактуется как "очередной глюк ваше глючной проги" (даже если по всем предыдушим было доказано - являются "глюками в генах юзера - хроническая криворукось")
это из практики.

> Мне в голову приходит только массив прздников составлять.
таблицу праздников в базе (а лучше и + выходные туда, заполнять предположительно но с возможностью изменить потом, т.к. "сдвиги" праздников могут сделать выходние рабочими днями)


 
grisme ©   (2006-03-12 12:20) [11]

> sniknik ©   (12.03.06 12:17) [10]
точно,лучше делать базу праздников. я в нете видал прогу (по-моему "Напоминалка"), у нее база праздников и дней рождений известных людей.)Забавно.^_^


 
TStas ©   (2006-03-12 12:21) [12]

Тут задача не корректно поставлена. Допустим, правда, получилось 30 дней. Считатьь это месяцем или только тогда , когда влез неразрезанный календарный месяц?
Кроме того выходные же часто двигают из-за праздников


 
Бугага ©   (2006-03-13 04:37) [13]

Извиняйте за то, что переполошил всех... Траблов то здесь нет совсем...

Две функции:
function isWeekEnd(D: TDateTime): boolean;
begin
 if (DayOfWeek(D)=1) or (DayOfWeek(D)=7) then
   Result:=true
 else
   Result:=false;
end;

function isHoliday(D: TDateTime): boolean;
var
 Day,Month,Year: word;
begin
 Result:=false;
 DecodeDate(D,Year,Month,Day);
 if fDM.qHolidays.Locate("HTEXT", IntToStr(Day)+Months[Month], []) then
   Result:=true;
end;

procedure CalcDays(D1: TDateTime; D2: TDateTime; var TotalDays: integer; var FullMonths: integer; var FullWeeks: integer; var FullWorks: integer; var FullWeekends: integer);
var
 Diff: integer;
begin
 // обнуление счетчиков
 FullMonths:=0;
 FullWeeks:=0;
 FullWorks:=0;
 FullWeekends:=0;
 // разность в днях между датам
 Diff:=Round(D2-D1);
 TotalDays:=Diff;
 // подсчет месяцев
 while Diff>=DaysInMonth(D1) do begin
   dec(Diff, DaysInMonth(D1));
   D1:=D1+DaysInMonth(D1);
   inc(FullMonths);
 end;
 // подсчет недель
 FullWeeks:=Diff div 7;
 dec(Diff, 7*FullWeeks);
 D1:=D1+7*FullWeeks+1;
 // подсчет рабочих и праздничных дней
 while D1<=D2 do begin
   if not isHoliday(D1) and not isWeekEnd(D1) then
     inc(FullWorks);
   D1:=D1+1;
 end;
 FullWeekends:=Diff-FullWorks;
end;


 
Бугага ©   (2006-03-13 04:39) [14]

Праздников много, но мне необходимо только те, что считаются выходными днями...
HTEXT       INFO                        

1 январь    Первый день года            
2 январь    Второй день города          
3 январь    Третий день года            
23 август   День защитников Отечества  
8 март      Международный Женский День  
1 май       Первомай                    
12 июнь     День независимости          
7 ноябрь    Седьмое ноября              
31 декабрь  Новый Год                  

А еще есть?


 
Бугага ©   (2006-03-13 04:40) [15]

А про месяцы получается, что месяц истек, если:
1.01 - 2.02
и не истек, если
1.01 - 1.02


 
grisme ©   (2006-03-13 05:03) [16]


> А еще есть?

А 13 Сентября??=((


 
Бугага ©   (2006-03-13 05:26) [17]

Ну это конечно... Но к сожалению его выходным не делают :)


 
grisme ©   (2006-03-13 05:51) [18]

Ну если делаешь прогу для рассчета выходных у программеров - будь уверен, они себе его таким сделают :))


 
Карелин Артем ©   (2006-03-13 07:40) [19]


> Бугага ©   (13.03.06 04:39) [14]

Как в вашей организации обстоит дело с выходными, если праздник выпадает на выходной день?


 
SergP.   (2006-03-13 08:27) [20]


> Бугага ©   (13.03.06 04:37) [13]
> Извиняйте за то, что переполошил всех... Траблов то здесь
> нет совсем...


> function isWeekEnd(D: TDateTime): boolean;
> begin
>  if (DayOfWeek(D)=1) or (DayOfWeek(D)=7) then
>    Result:=true
>  else
>    Result:=false;
> end;


Гы...


function isWeekEnd(D: TDateTime): boolean;
begin
 result:=DayOfWeek(D) in [1,7];
end;


 
SergP.   (2006-03-13 08:35) [21]


> А еще есть?


А религиозные праздники? Пасха например. (Хоть и припадает на воскресенье, но понедельник по этой причине выходной)
Только у нее нет фиксированной даты... Вычислять придется...


 
Бугага ©   (2006-03-13 10:01) [22]

> SergP.   (13.03.06 8:27) [20]

Пасиб ;)


 
Бугага ©   (2006-03-13 10:04) [23]

Я вот и спрашиваю, какие еще есть праздники, по которым люди отдыхают?

Пасха.. Еще?


 
Sergey13 ©   (2006-03-13 10:15) [24]

2[23] Бугага ©   (13.03.06 10:04)
Пятница, после обеда. 8-)


 
lookin ©   (2006-03-13 10:20) [25]

23 август - день защитника Отечества?


 
API ©   (2006-03-13 10:20) [26]

А 13 Сентября?

Осталось ровно полгода. :)


 
Карелин Артем ©   (2006-03-13 21:17) [27]

Пятница. У мусульман выходной.


 
Mike Kouzmine ©   (2006-03-13 21:36) [28]

9 мая уже не праздник? Эх мОлодежь, мОлодеж...


 
Труп Васи Доброго ©   (2006-03-13 23:49) [29]

Бугага ©   (13.03.06 4:39) [14]
Извини, но это БСК (бред сивой кобылы) потому как в зависимости от года праздниками БЫЛИ (7 ноября, 12 декабря, 2 мая) причём до какого то года 2 мая, 12 декабря,(2,3,4,5,7 января) и 23 февраля  праздниками опять же не были, и теперь, на данный момент не являются праздниками 7 ноября и 12 декабря, зато стал праздником 4 ноября. Так что если ты решил считать ПРАВИЛЬНО за любой год, то Консультант+ тебе в помощь, там есть график рабочих и праздничных/выходных дней, вот оттуда и бери.
Ты скажи для чего считаешь. Я делал как то вычислялку стажа (количество дней между двумя датами) так там всё через ж.пу считается по правилам расписаным в какой то директиве пенсионного фонда, а не как все люди привыкли считать. Так что будь внимательнее.



Страницы: 1 вся ветка

Текущий архив: 2006.04.02;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.038 c
15-1141077808
SkyRanger
2006-02-28 01:03
2006.04.02
У системы Windows Vista будет шесть версий


2-1142679198
anubis
2006-03-18 13:53
2006.04.02
Windоw


15-1142106008
ArtemESC
2006-03-11 22:40
2006.04.02
Помогите перевести на ан.яз...


15-1141722985
superoberon
2006-03-07 12:16
2006.04.02
Shelltreeview


15-1141842698
Volf_555
2006-03-08 21:31
2006.04.02
Как вывести формулу момента инерции для цилиндра?!