Верните правильное количество недель для григорианского календаря - PullRequest
3 голосов
/ 30 октября 2019

У меня проблема с календарем, который я использую для получения меньшего количества недель в течение определенных месяцев. Например, это происходит со мной в сентябре 2019 года, где мой номер равен 5, или в июле 2018 года, который также равен 5. Как я могу это исправить? это мой текущий код:

    private DateTime _calendarDate;
    int numWeeks = NumberOfWeeks(_calendarDate.Year, _calendarDate.Month);

    private int NumberOfWeeks(int year, int month)
    {
        return NumberOfWeeks(new DateTime(year, month, DateTime.DaysInMonth(year, month)));
    }
    private int NumberOfWeeks(DateTime date)
    {
        var beginningOfMonth = new DateTime(date.Year, date.Month, 1);

        while (date.Date.AddDays(1).DayOfWeek != CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
                    date = date.AddDays(1);

        return (int)Math.Truncate(date.Subtract(beginningOfMonth).TotalDays / 7f) + 1;
    }  

дополнительная информация о CultureInfo

enter image description here

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

Вот пример для апреля 2018 года, где вы даете мне 5 недель, а затем пропускается еще один, и поэтому я 'я получаю сообщение об ошибке

Может кто-нибудь догадаться, как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Когда вы можете использовать System.Globalization.Calendar, вы можете получить количество недель в месяце, используя GetWeekOfYear для первого и последнего дня месяца, а затем рассчитать разницу (и добавить 1, чтобы включить первую неделю),Это изменит ваш NumberOfWeeks() на следующий:

private int NumberOfWeeks(DateTime date)
    {
        Calendar calendar = CultureInfo.CurrentCulture.Calendar;
        var firstOfMonth = new DateTime(date.Year, date.Month, 1);


        var week1 = calendar.GetWeekOfYear(firstOfMonth, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
        var week2 = calendar.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Monday);

        int numberOfWeeks = (week2 - week1) + 1;

        return numberOfWeeks;
    }

Для вашего примера (апрель 2018 г.) это даст вам 6 в результате, а для мая 2018 г. - 5.

MSDN GetWeekOfYear

0 голосов
/ 30 октября 2019

Вот немного более математическое решение:

int myYear = 2019, myMonth = 12; // the example for December 2019
var firstMonthDay = new DateTime(myYear, myMonth, 1);
int delta = firstMonthDay.DayOfWeek - System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek;
if (delta < 0)
    delta += 7;

int daysInMonth = DateTime.DaysInMonth(myYear, myMonth);    
int weekLinesNumber = (int)Math.Ceiling((daysInMonth + delta) / 7F); // the result

Мы считаем дельту (может быть от 0 до 6), это количество дней с первого дня недели до первого следующегодень месяца. Затем мы подсчитываем полученное количество недель с помощью функции Math.Ceiling.

Короче говоря, мы добавляем к месяцу несколько дельта-дней в начале, чтобы получить новый дополнительный месяц, начиная с первого дняНеделя (по культуре). И затем мы подсчитываем общее количество занятых строк недели. Нет необходимости добавлять +1, когда мы используем Math.Ceiling функцию.

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