Как найти пятницу тринадцатое в C#

// Список пятниц 13-го числа между датой начала и окончания.
private void btnGo_Click(object sender, EventArgs e)
{
    lstResults.Items.Clear();

    // Получаем компоненты начала и конца даты.
    DateTime start_date = dtpStart.Value.Date;
    DateTime end_date = dtpEnd.Value.Date;
    int start_year = start_date.Year;
    int end_year = end_date.Year;

    // Зацикливание за выбранные годы.
    for (int year = start_year; year <= end_year; year++)
    {
        // Цикл в течение месяцев в году.
        for (int month = 1; month <= 12; month++)
        {
            // Посмотрим, будет ли в этом месяце 13-я пятница.
            DateTime test_date = new DateTime(year, month, 13);

            // Если мы не достигли даты начала, пропустите этот.
            if (test_date < start_date) continue;

            // Если мы закончили дату окончания, остановите цикл.
            if (test_date > end_date) break;

            // Смотрите, пятница.
            if (test_date.DayOfWeek == DayOfWeek.Friday)
                lstResults.Items.Add(test_date.ToShortDateString());
        }
    }
}

Код сначала очищает результат ListBox. Затем он получает даты начала и окончания и использует их для получения номеров начала и конца года.

Далее программа выполняет цикл между начальным и конечным годами включительно. За каждый год код перебирается через месяц с номерами от 1 до 12. Для каждого месяца код создает объект DateTime, представляющий 13-е число месяца в данном году.

Если дата предшествует выбранной дате начала, код использует оператор continue, чтобы пропустить оставшуюся часть цикла месяца и продолжить со следующего месяца. Это может произойти до 11 раз (если начальный месяц - декабрь).

Если дата указана после конечной даты, код использует инструкцию break для выхода из цикла месяца. Это происходит не один раз в течение последнего года, поэтому цикл года также заканчивается в этот момент. (Это не произойдет вообще, если конечный месяц - декабрь.)

Наконец, если код все еще запущен в цикле, он проверяет свойство DayOfWeek даты тестирования, и добавляет его в результат ListBox, если это пятница.

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

Во-первых, когда программа получает даты начала и окончания, она явно принимает только часть даты выбранных значений DateTime. Если вы сравниваете переменные DateTime, и вы не заинтересованы в части времени, вам все равно нужно знать эту часть. Если код использует значение, выбранное DateTimePicker или каким-либо другим элементом управления, вам может потребоваться удалить временную часть, чтобы получить правильные результаты.

В этом примере предположим, что время, выбранное dtpStart, - пятница 13 июня 2014 года в 13:30:00. Когда код повторяется через месяцы, код учитывает дату 13 июня 2014 года, но когда вы инициализируете объект DateTime, время опускается, поэтому по умолчанию оно равно 00:00:00. test_date & gt; end_date считает, что дата теста перед датой начала 13:30:00, поэтому она пропускает эту дату.

Программа исправляет эту проблему, используя только дату даты начала и окончания. (Обратите внимание, что эта проблема может привести к возникновению связанной проблемы: тщательное тестирование. В этом примере вы можете найти эту проблему, протестировав программу с датой начала и окончания, которая находится в пятницу тринадцатых.)

Источник: http://csharphelper.com/blog/2017/08/find-friday-the-thirteenths-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector