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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
1-1281527200
qpwoeiruty
2010-08-11 15:46
2012.01.29
Наследование


15-1318097571
Born Loser
2011-10-08 22:12
2012.01.29
Как передать данные из драйвера


15-1318195803
Юрий
2011-10-10 01:30
2012.01.29
С днем рождения ! 10 октября 2011 понедельник


1-1283231923
Элия
2010-08-31 09:18
2012.01.29
Как определить виден ли скролл. ListView.


15-1318105802
Юрий
2011-10-09 00:30
2012.01.29
С днем рождения ! 9 октября 2011 воскресенье