Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-40130
Victor
2002-04-04 07:37
2002.06.13
Ping


8-40121
AlexDov
2002-01-25 14:53
2002.06.13
OpenGL в Bitmap


3-39929
koks
2002-05-21 10:00
2002.06.13
Вопрос по TADOQuery


14-40180
bander_log
2002-05-13 11:17
2002.06.13
Проблема с графикой... Прикол такого характера...


6-40142
DHCP
2002-04-02 19:17
2002.06.13
Чат и ServerSocket





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский