Количество недель в месяце Vb.Net - PullRequest
0 голосов
/ 22 января 2020

Есть ли какая-либо функция DateTimePicker для получения количества полных недель в месяце?

Я ищу что-то вроде:

WeeksInMonth("01/01/2020") = 5

Это будет количество недель в месяце вручную рассчитано для этого года:

enter image description here

Исправление: сентябрь имеет 4 недели.

РЕДАКТИРОВАТЬ:

Если месяц начинается в середине недели, он считается полной неделей. Также следует считать полную неделю, если месяц заканчивается в середине недели. С понедельника по воскресенье.

РЕДАКТИРОВАТЬ 2:

К середине недели я имею в виду, что если неделя начинается в четверг, она рассматривает ее как полную неделю, потому что это было 4 дня (четверг, пятница, суббота и воскресенье) из 7.

То же самое для конца, если конец недели в четверг будет засчитан как полная неделя, если неделя заканчивается sh в понедельник, вторник или В среду это не считается, потому что у него есть только 3 дня из 7.

Я принимаю во внимание, что моя полная неделя начинается в понедельник и заканчивается в воскресенье.

Пример. Январь 2020 Первая полная неделя: с 30 декабря 2010 года по 05 января 2020 года.

1034 * Другим примером будет март 2020 года. Последняя полная неделя для меня - с 23 марта 2020 года по 29 марта. -2020, 2 оставшихся дня (30,31) будут частью первой недели 1 апреля.

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Согласно вашей логике c, неделя длится месяц, если четверг этого месяца. Если четверг наступает через месяц, то по крайней мере понедельник, вторник и среда (если в конце) или пятница, суббота и воскресенье (если в начале). Поэтому, если вы посчитаете количество четвергов в месяце, вы должны получить количество недель в этом месяце.

Просто используйте LINQ, чтобы получить все дни месяца, затем возьмите только дни, которые являются четвергом, а затем сосчитайте эти дни

Public Function GetNumberOfWeeksInMonth(year As Integer, month As Integer) As Integer
    Return Enumerable.Range(1, DateTime.DaysInMonth(year, month)).
        Select(Function(d) New DateTime(year, month, d)).
        Where(Function(d) d.DayOfWeek = DayOfWeek.Thursday).
        Count()
End Function

' Concise version with Count with predicate

Public Function GetNumberOfWeeksInMonth(year As Integer, month As Integer) As Integer
    Return Enumerable.Range(1, DateTime.DaysInMonth(year, month)).
        Count(Function(d) (New DateTime(year, month, d)).DayOfWeek = DayOfWeek.Thursday)
End Function

Назовите его

For i = 1 To 12
    Console.WriteLine($"{New DateTime(2020, i, 1):MMM}{vbTab}{GetNumberOfWeeksInMonth(2020, i)}")
Next

Янв 5
Фев 4
Мар 4
Апр 5
Май 4
Июн 4
Июль 5
Авг 4
Сен 4
5 октября
Ноябрь 4
Де c 5

1 голос
/ 22 января 2020

Я предполагаю, что это что-то похожее на схему ISO 8601 для года-недели, где неделя (период с понедельника по воскресенье) приходится на год, в котором содержится четверг.

Здесь месяц содержит неделю, если четверг этой недели приходится на месяц.

Логически число таких недель в месяце совпадает с числом четвергов в этом месяце.

Вы можете получить эту цифру из числа дней месяца в месяце и дня недели первого месяца месяца.

28-дневный месяц всегда содержит ровно 4 четверга. Месяцы с числом дней, превышающим 28, могут содержать 5 четвергов.

Вы можете преобразовать число дней недели в ISO (Mon = 1, Sun = 7) в следующий формат: ((weekday + 2) Мод 7) - 2

пн = 1, вт = 2, ср = 3, чт = 4, пт = -2, сб = -1, вс = 0

Затем добавьте это скорректированное число дней недели в число дней месяца. Если результат превышает 32, то это месяц, содержащий 5 недель.

Таким образом, 31-дневный месяц, начинающийся с понедельника, дает цифру 32 (31 + 1). Содержит 4 недели.

31-дневный месяц, начинающийся во вторник, дает цифру 33 (31 + 2). Он содержит 5 недель.

31-дневный месяц, начинающийся с пятницы, дает цифру 29 (31 + (-2)). Это содержит 4 недели.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...