Получите Неделю Года - PullRequest
       12

Получите Неделю Года

7 голосов
/ 19 октября 2011

Delphi Xe, Win 7, System TimeZone UTC + 4: 0, первый день недели в системе - понедельник, время синхронизировано с time.windows.com

в палитре стандартных компонентов Delphi Win32присутствует компонент MonthCalendar, у него свойство WeekNubers = true (отображение номеров недель), дата = сейчас, первый день - понедельник.

Показывает по 19 числу (сегодня) - номер недели 43.

Я запрашиваю номер через dateutils.WeekOfTheYear (сейчас) = возвращает 42.

enter image description here

Источник (0,5 Мб) http://www.sendspace.com/file/yuz6ko

Судя поисходный код компонента MonthCalendar - там вроде все верно (даже если не выставлять первый день недели, он принимает значение из системных параметров).

А в запросе WeekOfTheYear сказано, что все считаетсятакже применялся стандарт ISO, но цифры не совпадают: (

никак не пойму, куда исчезает одна неделя - если смотреть по календарю, должно быть 43, а если учесть, что недели 53 ипервый концертns в прошлом году ...

Кстати WeekOfTheYear на 01.01.2011 тоже возвращает 52, хотя вроде должно возвращать 1 ...

Почему различия и где это правильно?

Ответы [ 3 ]

11 голосов
/ 19 октября 2011

Оба результата верны, разница в том, что функция DateUtils.WeekOfTheYear использует стандартное определение недели ISO 8601 . That is, a week is considered to start on a Monday and end on a Sunday.

Проверьте это объяснение о числах недель в формате ISO 8601.

Если 1 января в понедельник, вторник, среду или четверг, Неделя 01. Если 1 января в пятницу, субботу или воскресенье, неделя 52 или 53 предыдущего года (недели 00 нет). 28 декабря всегда в последнюю неделю года.

Также в интерактивной справке Embarcadero для функции DateUtils.WeekOfTheYear указано

.... если первый календарный день года - пятница, суббота или Воскресенье, затем в течение первых трех, двух или одного дня календаря year, WeekOfTheYear возвращает последнюю неделю предыдущего года. Точно так же, если последний календарный день года - понедельник, вторник, или в среду, то в течение последних одного, двух или трех дней календарный год, WeekOfTheYear возвращает 1 (первая неделя следующего календарный год).

Так что 01.01.2011 была суббота этой недели, она считается номером 52 предыдущего года.

И это также объясняет, почему номер недели, возвращаемый на сегодня (19-10-2011), равен 42 вместо 43.

2 голосов
/ 19 октября 2011

TMonthCalendar может рассматривать последнюю неделю года как первую неделю следующего года, функция WeekOfTheYear не делает этого, следовательно, разница.

Например, согласно TMonthCalendar1 Jan 2012 относится как к последней неделе 2011 года, так и к первой неделе 2012 года;2 Jan 2012 - первый день второй недели 2012 года.
Согласно функции WeekOfTheYear, 1 Jan 2012 относится только к последней неделе 2011 года;2 Jan 2012 - это первый день первой недели 2012 года.

Понедельник - первый день недели для меня.

2 голосов
/ 19 октября 2011

Прежде всего, я не вижу разницы между номерами недель в компоненте TMonthCalendar и теми, которые возвращены DateUtils.WeekOfTheYear().(Понедельник - первый день недели в моей системе.) Оба показывают 42 для текущей недели и 52 (не 53) для недели 2011-01-01.(Это 53 для 2010-01-01, так что, может быть, вы просто перепутали это.)

Теперь, почему это 52 или 53, но не 1, ну, это согласно определение первой недели по ISO :

Первая неделя - это неделя с первым четвергом года.

Итак, неделя номер 1в 2011 году начинается с 2011-01-03, а предыдущий относится к предыдущему году ISO.

...