I don't understand why the calendar pass from 53 to 2 and not 53 to 1
Это в значительной степени работает, как и ожидалось. При подсчете недель эти первые 3 дня 2016 года считаются первой неделей 2016 года.
Обратите внимание, что элемент управления не делает ничего, связанного с календарем или дисплеем. Это просто изменение стиля отображения окна календаря, предоставляемого Windows. Код, показанный на странице CP, — это все, что есть, и в основном он просто устанавливает флаг стиля, чтобы указать Windows добавить номера недель:
style = style | MCS_WEEKNUMBERS;
Запись MSDN для него указывает:
Неделя 1 определяется как первая неделя, которая содержит не менее четырех дней.
Поскольку 1-3 января — это не 4 дня, может показаться, что это либо ошибка, либо используется другой календарь, либо MSDN устарел.
Из комментариев:
From what i understood, what's wrong is "date format". Maybe it's not a 8601
Нет, это нечто большее: ISO8601 — это другой календарь, который не реализован ни в Windows, ни в NET. Википедия отмечает:
Первая неделя года — это неделя, которая содержит первый четверг года (и, следовательно, всегда содержит 4 января). Таким образом, нумерация недель по ISO немного отличается от григорианской для некоторых дней, близких к 1 января.
Это то, что вы видите в раскрывающемся списке календаря.
Альтернативный
Но неделю года ISO8601 легко рассчитать:
Начните с кода для GetISOWeekOfYear()
из мой ответ на очень похожий вопрос. Вы можете использовать это для отображения недели года ISO8601 для выбранной даты в метке или чем-то рядом с DTP.
Выведите номера первой и последней недель с 2011 по 2021 год:
Dim cal As Calendar = CultureInfo.CurrentCulture.DateTimeFormat.Calendar
For n As Int32 = 2011 To 2017 '2021
dt = New DateTime(n, 12, 21)
Console.WriteLine(" ***** {0} *****", n)
For j = 0 To 3
Dim NetWk = cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, firstD)
Console.WriteLine("Invariant Date: {0} ISO #:{1:00} NET #:{2:00}",
dt.ToString("MM/dd/yyyy"), GetISOWeekOfYear(dt), NetWk)
dt = dt.AddDays(7)
Next
Next
Результат за 2015/2016 часть:
***** 2015 *****
Дата инварианта: 21.12.2015 ISO #:52 NET #:52
Дата инварианта: 28.12.2015 ISO #:53 NET #:53< br> Дата инварианта: 04.01.2016 ISO #:01 NET #:02
Дата инварианта: 11.01.2016 ISO #:02 NET #:03
***** 2016 **** *
Дата изменения: 21.12.2016 ISO #:51 NET #:52
Дата изменения: 28.12.2016 ISO #:52 NET #:53
Дата изменения: 04.01.2017 ISO #:01 NET #:01
Инвариант Дата: 11.01.2017 ISO #:02 NET #:02
Если вы не хотите написать свой собственный элемент управления с нуля или лицензировать тот, который может быть установлен для другого календаря (и имеет определение для ISO8601), это может быть лучшим, что вы можете сделать.
Итог: номер недели не является неправильным. Он использует другой календарь, чем вы ожидаете / хотите.
Использованная литература:
person
Ňɏssa Pøngjǣrdenlarp
schedule
03.03.2016