Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1318236331
Бездомный
2011-10-10 12:45
2012.01.29
Как пропустить при дебаге модуль system (или другие)?


2-1319363512
Nucer
2011-10-23 13:51
2012.01.29
Список записей с быстрым поиском по ключу int64


15-1318268712
Jeer
2011-10-10 21:45
2012.01.29
Вот я и стал тестем и приобрел второго сына.


15-1317835426
Empleado
2011-10-05 21:23
2012.01.29
Project Management Software


1-1282631144
Avil
2010-08-24 10:25
2012.01.29
Разница кодировок при копировании и вставке





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