Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Номер недели! [D5, Win95/98]


koks ©   (2002-05-31 10:07:00) 

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

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


Lusha   (2002-06-03 17:35:00) [1]

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

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


koks   (2002-06-03 16:11:00) [2]

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


Anatoly Podgoretsky   (2002-06-03 14:02:00) [3]

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


Lusha   (2002-06-03 12:48:00) [4]

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

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


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

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

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


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

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


koks   (2002-06-03 09:34:00) [7]

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


Lusha   (2002-05-31 17:52:00) [8]

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


Lusha   (2002-05-31 17:51:00) [9]

>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;


koks   (2002-05-31 16:24:00) [10]

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

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

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

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


Anatoly Podgoretsky   (2002-05-31 15:08:00) [11]

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


Lusha   (2002-05-31 15:03:00) [12]

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


Anatoly Podgoretsky   (2002-05-31 14:39:00) [13]

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


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

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 чтобы найти способ, как этот номер оттуда вытащить - ничего не нашел, но пришел к выводу что номер недели берется откуда-то из системы... Вот если бы знать - откуда !


Song   (2002-05-31 10:35:00) [15]

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


Esu   (2002-05-31 10:28:00) [16]

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


Anatoly Podgoretsky   (2002-05-31 10:26:00) [17]

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


Lusha   (2002-05-31 10:25:00) [18]

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


Внук   (2002-05-31 10:21:00) [19]

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


VictorT   (2002-05-31 10:19:00) [20]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо