Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
Бугага ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.033 c
15-1141896338
Зм1й
2006-03-09 12:25
2006.04.02
Проблемы с локалкой


4-1137144109
Andrey C
2006-01-13 12:21
2006.04.02
Програмный клик мышки


15-1141896643
leonidus
2006-03-09 12:30
2006.04.02
Процедуры и функции для работы с Widestring


2-1142598661
ttt_111
2006-03-17 15:31
2006.04.02
Как свернуть программу в tray?


15-1141977108
начинающий
2006-03-10 10:51
2006.04.02
UI исключительно при помощи COM





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский