Форум: "Основная";
Текущий архив: 2002.06.13;
Скачать: [xml.tar.bz2];
ВнизНомер недели! Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c