Форум: "Прочее";
Текущий архив: 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