Как я могу учесть изменение месяца с помощью DateTimePicker при сравнении двух дат - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь создать базовое c приложение для бронирования номера в отеле, используя windows формы и C#. Я изначально начал с создания for l oop на том основании, что дата прибытия всегда будет меньше даты отъезда. Все это работало, как и ожидалось, пока я не попытался забронировать номер на 30 июня и отбыть 1 июля. Как видно из кода ниже, он никогда не будет вводить for-l oop, поскольку дата прибытия не <даты отъезда. Я создаю maxDays int, который содержит максимальное количество дней, в течение которых человек собирается остаться, и использую его как якорь для моего l oop. Это, вероятно, сводится к большинству проблем логики c и некоторым ошибкам sh с моей стороны, поскольку у меня мало опыта в использовании дат в моем коде. Любой совет по этому поводу был бы великолепен. </p>

private void CalculateButton_Click(object sender, EventArgs e)
    {
        //Prints out number of nights at hotel.
        NumberOfNightsTextbox.Text = (DepartureDatePicker.Value.Day - ArrivalDatePicker.Value.Day).ToString("d");

        //Creates a copy of the current Arrival and Departure date.
        DateTimePicker ArrivalCopy = ArrivalDatePicker;
        DateTimePicker DepartureCopy = DepartureDatePicker;

        //Creates an int to store the current Arrival and Departure Month.
        int arrivalMonth = ArrivalDatePicker.Value.Month;
        int departureMonth = DepartureDatePicker.Value.Month;

        //Creates a int that is used to determine how many loops the For statement should loop for.
        //May need to add the monthly days after doing a check.
        int maxDays = DepartureDatePicker.Value.Day;

        //Gets the difference of the Arrival and Departure and converts it to an Int.
        double differnceD = (DepartureDatePicker.Value - ArrivalDatePicker.Value).TotalDays;
        int diff = (int)Math.Round(differnceD);

        if (arrivalMonth < departureMonth)
        {
            if (departureMonth == 1 || departureMonth == 3 ||
                departureMonth == 5 || departureMonth == 7 ||
                departureMonth == 8 || departureMonth == 10 ||
                departureMonth == 11)
            {
                diff += 31;

            }
            else if (departureMonth == 2)
            {
                diff += 28;

            }
            else if (departureMonth == 4 || departureMonth == 6 || departureMonth == 9 || departureMonth == 11)
            {
                diff += 30;

            }
        }
        if (arrivalMonth == departureMonth)
        {
            for (int i = ArrivalDatePicker.Value.Day; i < maxDays + 1; i++)
            {
                if (ArrivalCopy.Value.DayOfWeek == DayOfWeek.Saturday || ArrivalCopy.Value.DayOfWeek == DayOfWeek.Sunday)
                {
                    increasePriceNight++;
                }

                ArrivalCopy.Value = ArrivalCopy.Value.AddDays(1);
            }
        }

        TotalPriceTextbox.Text = (((diff - increasePriceNight) * 120) + (increasePriceNight * 150)).ToString("C");

        AvgPricePerNightTextbox.Text = ((((diff - increasePriceNight) * 120) + (increasePriceNight * 150)) / diff).ToString();
    }

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Не знаю, почему вы выбрали такую ​​логику c. Вы можете сделать это намного проще

double days = (DepartureDatePicker.Value - ArrivalDatePicker.Value).TotalDays;
int daysTotal = Convert.ToInt32(Math.Ceiling(days));

По сути, если оригинал days имеет значение 0,2 или 1,3, вы просто округляете его до следующего целого числа. Это количество дней, за которые человек должен заплатить.

И теперь, имея количество дней, вы можете повторить свой dates, добавить 1 день на каждую итерацию и проверить, какой это день недели, и взимать надлежащую плату - скидка или дополнительная плата

DateTeime startDate = ArrivalDatePicker.Value.Date;
decimal totalPrice = 0;
for (int dayNo = 0; dayNo < daysTotal;  dayNo++)
{
    DateTime currDate = startDate.AddDays(dayNo);
    totalPrice += GetPriceForDate(currDate);
}

В GetPriceForDate вы исследуете дату. Какой день недели, какой день месяца и т. Д. c, и оцените его в соответствии с бизнес-правилами.

0 голосов
/ 23 апреля 2020

У вас есть общее количество дней, в течение которых человек будет оставаться там. Вы можете использовать это с методом AddDays, чтобы увидеть, суббота или воскресенье. Например

 for ( int i = 0; i <= maxDays; i++ )
        {
            DateTime date = ArrivalCopy.Value.AddDays( i );

            if ( date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday )
            {
                increasePriceNight++;
            }
        }
...