Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
Внизномер недели Найти похожие ветки
← →
Gu (2011-10-19 02:07) [0]во вкладке стандартных компонентов есть MonthCalendar, у него свойство WeekNubers=true (отображение номеров недель), date=now
Показывает на 19 число номер недели 43
запрашиваю номер через dateutils.WeekOfTheYear(now) возвращает 42
почему так и где правильно?
← →
Германн © (2011-10-19 02:21) [1]
> почему так и где правильно?
>
А номер первой недели - 0 или 1?
Ты уж разберись сам.
← →
Gu (2011-10-19 02:42) [2]в справке
WeekOfTheYear returns a value from 1 through 53.
Note: WeekOfTheYear uses the ISO 8601 standard definition of a week. That is, a week is considered to start on a Monday and end on a Sunday.
а WeeksinYear возвращает 52 хотя там тоже
WeeksInYear defines the first week of the year according to the ISO 8601 standard. That is, the first week of the year is the one that includes the first Thursday of the year (the first week that has four or more days in the year). This means that WeeksInYear always returns either 52 or 53.
вообщем непонятно все равно куда девается одна и где правильно. первый день в календаре (MonthCalendar) стоит ПНД, в системе тоже, т.е. WeekOfTheYear должна верно возвращать, а календарь видимо фигню показывает - только для буржуев с их первым ВОСКР в неделе. или у мну уже мозги перегрелись...
← →
Anatoly Podgoretsky © (2011-10-19 09:15) [3]
> почему так и где правильно?
Обе правильны
← →
DVM © (2011-10-19 22:40) [4]
> Gu (19.10.11 02:42) [2]
> WeekOfTheYear должна верно возвращать, а календарь видимо
> фигню показывает - только для буржуев с их первым ВОСКР
> в неделе. или у мну уже мозги перегрелись...
делфи считает началом недели не понедельник.
← →
han_malign (2011-10-20 09:53) [5]
> А номер первой недели - 0 или 1?
MSDN:
MCS_WEEKNUMBERS
Version 4.70. The month calendar control will display week numbers (1-52) to the left of each row of days. Week 1 is defined as the first week that contains at least four days.
Delphi Help: DecodeDateWeek
AWeekOfYear returns the week within AYear that AValue represents, where 1 is the first week with four or more days.
> только для буржуев с их первым ВОСКР в неделе
- а в этом году по барабану - Воскресенье или Понедельник... даже Вторник сойдет... под анамнез(на 19.10.11) подходит только(и исключительно) Среда.
С Ч П С В П В
01 02 03 04
...
19
в реализации календаря вроде все честно:TCommonCalendar
property FirstDayOfWeek: TCalDayOfWeek read FFirstDayOfWeek write SetFirstDayOfWeek
default dowLocaleDefault;
procedure TCommonCalendar.SetFirstDayOfWeek(Value: TCalDayOfWeek);
var
DOWFlag: Integer;
A: array[0..1] of char;
begin
if HandleAllocated then
begin
if Value = dowLocaleDefault then
begin
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, A, SizeOf(A));
DOWFlag := Ord(A[0]) - Ord("0");
end
else
DOWFlag := Ord(Value);
if CalendarHandle <> 0 then
MonthCal_SetFirstDayOfWeek(CalendarHandle, DOWFlag);
end;
FFirstDayOfWeek := Value;
end;
в WeekOfTheYear первый день захардкоден(понедельник), и вроде тоже все честно:const
CDayMap: array [1..7] of Word = (7, 1, 2, 3, 4, 5, 6);
procedure DecodeDateWeek(const AValue: TDateTime; out AYear, AWeekOfYear,
ADayOfWeek: Word);
var
LDayOfYear: Integer;
LMonth, LDay: Word;
LStart: TDateTime;
LStartDayOfWeek, LEndDayOfWeek: Word;
LLeap: Boolean;
begin
LLeap := DecodeDateFully(AValue, AYear, LMonth, LDay, ADayOfWeek);
ADayOfWeek := CDayMap[ADayOfWeek];
LStart := EncodeDate(AYear, 1, 1);
LDayOfYear := Trunc(AValue - LStart + 1);
LStartDayOfWeek := DayOfTheWeek(LStart);
if LStartDayOfWeek in [DayFriday, DaySaturday, DaySunday] then
Dec(LDayOfYear, 8 - LStartDayOfWeek)
else
Inc(LDayOfYear, LStartDayOfWeek - 1);
if LDayOfYear <= 0 then
DecodeDateWeek(LStart - 1, AYear, AWeekOfYear, LDay)
else
begin
AWeekOfYear := LDayOfYear div 7;
if LDayOfYear mod 7 <> 0 then
Inc(AWeekOfYear);
if AWeekOfYear > 52 then
begin
LEndDayOfWeek := LStartDayOfWeek;
if LLeap then
begin
if LEndDayOfWeek = DaySunday then
LEndDayOfWeek := DayMonday
else
Inc(LEndDayOfWeek);
end;
if LEndDayOfWeek in [DayMonday, DayTuesday, DayWednesday] then
begin
Inc(AYear);
AWeekOfYear := 1;
end;
end;
end;
end;
- значит либо Среда, либо Month Calendar Control - кривой...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c