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

Вниз

Номер недели!   Найти похожие ветки 

 
koks ©   (2002-05-31 10:07) [0]

Господа мастера! Подскажите, как рассчитать номер недели по дате...(любого типа)
Уже неделю бьюсь - ничего не получается...

Заранее АГРАмное СПАСИБО!


 
VictorT ©   (2002-05-31 10:19) [1]

Какой именно номер? В месяце?


 
Внук ©   (2002-05-31 10:21) [2]

Вероятно, подсчитать количество дней между заданной датой и Новым годом и поделить на 7 ?


 
Lusha ©   (2002-05-31 10:25) [3]

>koks © (31.05.02 10:07)
Твою мать... :(
http://delphi.mastak.com/cgi-bin/forum.pl?look=1&id=1021532114&n=1


 
Anatoly Podgoretsky ©   (2002-05-31 10:26) [4]

Все зависит по какому стандарту считать, Внук привел один из стандартов, по которуму неделя может начинать с любого из дней недели, по другим стандартам неделя начинается с Понеделника и вся суть стоит в определении первой недели


 
Esu ©   (2002-05-31 10:28) [5]

DayOfWeek(Now) - получишь день недели для текущего времени.
(только помни, что неделя у них с воскресенья начинается)


 
Song ©   (2002-05-31 10:35) [6]

DayOfWeek() - ISO
DayOfTheWeek() - ГОСТ


 
koks ©   (2002-05-31 14:22) [7]

2 Lusha:

function WeekOfYear(ADate : TDateTime) : Integer;
var AYear, AMonth, ADay : Word;
Year1stDate : TDateTime;
begin
DecodeDate(ADate, AYear, AMonth, ADay);
Year1stDate := EncodeDate(AYear, 1, 1);
Result := 7 - DayOfWeek(Year1stDate);
Result := Trunc(ADate) - Trunc(Year1stDate) + 1 - Result;
if (Result mod 7) = 0 then Result := Result div 7 + 1
else Result := Result div 7 + 2;
end;

Тестировал функцию, сравнивая с TMonthCalendar. Там есть св-во WeekNumbers. Так вот - эта функция неправильно работает с субботой и воскресеньем (она относит их на будущую неделю). Т.е. как бы неделя начинается с субботы.
Но вопорос не в том - я залез в этот TMonthCalendar чтобы найти способ, как этот номер оттуда вытащить - ничего не нашел, но пришел к выводу что номер недели берется откуда-то из системы... Вот если бы знать - откуда !


 
Anatoly Podgoretsky ©   (2002-05-31 14:39) [8]

koks © (31.05.02 14:22)
Работает как положено, в соотвествии с поределенным алгоритмом.
А с какого дня начинается неделя


 
Lusha ©   (2002-05-31 15:03) [9]

>koks © (31.05.02 14:22)
На какой дате она неверно отрабатывает?


 
Anatoly Podgoretsky ©   (2002-05-31 15:08) [10]

Проверь в цикле для первого января и определишь алгоритм


 
koks ©   (2002-05-31 16:24) [11]

2 Lusha:
Я делал так:
На форме - TMonthCalendar и TStaticText;

обработчик TMonthCalendar.OnChange:

begin
StaticText.Caption := IntToStr(WeekOfYear(MonthCalendar.Date))
end;

При этом, MonthCalendar c включенным св-ом WeekNumbers показывает номера недели... (так вот, для Сб и Вс дни недели в MonthCalendar и WeekOfYear(..) различаются... Для других дней - все OK).


 
Lusha ©   (2002-05-31 17:51) [12]

>koks © (31.05.02 16:24)
И должны отличаться... Я основывался на том, что нумерация недель начинается с первого дня года независимо от того является ли первая неделя полной или нет (правда обманулся в определении номера первой недели :) )... Использовать для TMonthCalendar в качестве проверки не совсем корректно, поскольку у него первые дни года могут входить в последнюю неделю предыдущего и соответственно иметь номер 52 или 53... Я думаю в Ваших интересах чтобы последние дни года считались 52-й или 53-й неделей, а первые считались 1-й даже если на самом все они составляют одну календарную неделю...

Вот этот вариант функции работает корректно, на мой взгляд...
function WeekOfYear(ADate : TDateTime) : Integer;
var AYear, AMonth, ADay : Word;
Year1stDate : TDateTime;
begin
Result := 0;
DecodeDate(ADate, AYear, AMonth, ADay);
Year1stDate := EncodeDate(AYear, 1, 1);
while DayOfWeek(Year1stDate) <> 2 do Year1stDate := Year1stDate + 1;
if Year1stDate <> EncodeDate(AYear, 1, 1) then inc(Result);
if ADate >= Year1stDate then
Result := Result + (Trunc(ADate) - Trunc(Year1stDate)) div 7 + 1;
end;



 
Lusha ©   (2002-05-31 17:52) [13]

Забыл добавить... Проверка на двойку - неделя начинается с понедельника...


 
koks ©   (2002-06-03 09:34) [14]

2Lusha
Огромное спасибо Вам за разъяснения. Функцию мы(вы) конечно доработаем(те). Но я повторно задал воспрос потому что чую, что этот преславутый номер недели можно как-то вытащить из системы. (Через API или там как - я в этом не силен, честно...). Ведь как-то это делает TMonthCalendar.... Он может это и делает некорректно, но ведь не от балды же.... Кстати, если сравнить его номера недели с календарями которые у нас висят по всему офису - все OK.
Так вот, уважаетмые знатоки, мой вопрос остается открытым...



 
Andrey007   (2002-06-03 10:49) [15]

По-моему, если в процедуре, предложенной Lusha, вместо DayOfWeek использовать DayOfTheWeek, то воскресенье будет в той неделе, которая заканчивается на этом воскресении, а в той, которая с него начинается.


 
Andrey007   (2002-06-03 10:51) [16]

Опечатка: "а НЕ в той, которая с него начинается."

И ещё по поводу API - посмотрите исходный код TMonthCalendar, может чего найдёте.


 
Lusha ©   (2002-06-03 12:48) [17]

>koks © (03.06.02 09:34)
Кстати, если сравнить его номера недели с календарями которые у нас висят по всему офису - все OK.

Настоятельно рекомендую поднять Ваши офисные календари за январь 1999 или 2000 годов... И еще раз перечитать реплику Anatoly Podgoretsky © (31.05.02 10:26)...


 
Anatoly Podgoretsky ©   (2002-06-03 14:02) [18]

Моя реплика касаентся стандартов на дни недели и номера недель, надо сначало определиться с этим, остальное ерунда, головая математика


 
koks ©   (2002-06-03 16:11) [19]

2Lusha! Я вовсе не хочу сказать, что функция плохо работает (или - упаси боже - не работает). Я лишь хочу сказать, что наверняка существует какой-то другой вариант, не через пользовательскую функцию по аргументу TDateTime....


 
Lusha ©   (2002-06-03 17:35) [20]

>koks © (03.06.02 16:11)
Вы меня опять не поняли... Я лишь хотел сказать, чтобы Вы выяснили какой алгоритм определения номера недели Вам необходим... Смею Вас заверить, что, например, Oracle считает недели совсем не так, как TMonthCalendar... А в свете Вашей первой реплики о том, что необходима группировка по номеру недели, я смею предположить, что то как считает TMonthCalendar Вам как раз и не подходит... Поверьте, 2002 год - частный случай и нет никакой гарантии, что в 2005 Вы не узнаете от пользователей все, что они думают о Вас и о Вашей программе... :)

P.S. А правильно считает предложенная мной процедурка или нет, мне по большому счету... :)



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

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

Наверх




Память: 0.51 MB
Время: 0.016 c
7-40189
pvn
2002-03-14 16:44
2002.06.13
управление samsung er-4615R


1-40081
Goblinus
2002-06-02 20:58
2002.06.13
RichEdit


1-40026
Dr. Web
2002-05-30 09:07
2002.06.13
Про иконки в ElegantMDI...


1-40015
PTE
2002-06-03 18:20
2002.06.13
подстановка значения


1-40096
ION T
2002-06-03 01:06
2002.06.13
траверсия полей в записи