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