Найти время и продолжительность в определенном диапазоне времени - PullRequest
1 голос
/ 25 июля 2011

Я сделал небольшое приложение для парковки в C #.Существуют различные цены в зависимости от типа автомобиля и часового пояса.День можно разделить на часовые пояса (например, утро, день, вечер и ночь).Теперь, если клиент прекращает парковку, я хочу вычислить, в каких часовых поясах он припаркован и как долго.

Например, утренний часовой пояс начинается в 6:00 и заканчивается в 12:00, дневной часовой пояс начинается в 12:00.и заканчивается в 16:00, часовой пояс начинается в 16:00 и заканчивается в 23:00, а часовой пояс начинается в 23:00 и заканчивается в 6:00.Клиент начал парковку своей машины в 00:30 и заканчивает парковку в 6:32.В настоящее время у меня есть 4 переменные для этого: время начала парковки, время окончания парковки и время начала часового пояса, а также время окончания часового пояса.

Второй пример будет аналогичен паркам клиентов 24 часа, тогда время парковки охватывает все часовые пояса.1005 *

Как проще всего подсчитать, сколько часов и минут клиент припарковал на своем автомобиле в разных часовых поясах?

С уважением, evilone

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

Получите ответ от MSDN и опубликуйте его здесь, чтобы другие тоже могли извлечь из него уроки.

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            DateTime start = new DateTime(2011, 7, 25, 0, 30, 0);
            DateTime end = new DateTime(2011, 7, 26, 6, 32, 0);
            List<DateTime> listTimeZones = CalculateTotalTime(start, end);

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < listTimeZones.Count; i++)
            {
                sb.AppendLine(String.Format("{0}. {1}: from {2} to {3}",
                                            i + 1,
                                            GetZoneInWords(listTimeZones[i].Hour),
                                            String.Format("{0:dd.MM.yyyy hh:mm}", listTimeZones[i]),
                                            (i + 1) < listTimeZones.Count
                                                ? String.Format("{0:dd.MM.yyyy hh:mm}", listTimeZones[i + 1])
                                                : "Parking ended"));
            }
            MessageBox.Show(sb.ToString());
        }

        private List<DateTime> CalculateTotalTime(DateTime start, DateTime end)
        {
            DateTime temp = start;

            int hour = start.Hour;
            int minute = start.Minute;

            int morning = 6;
            int day = 12;
            int evening = 17;
            int night = 23;

            List<DateTime> timeZones = new List<DateTime>();

            do
            {
                temp = temp.AddHours(1);
                if (temp.Hour == morning || temp.Hour == day ||
                    temp.Hour == evening || temp.Hour == night)
                {
                    timeZones.Add(temp);
                }
            } while (temp < end);

            return timeZones;
        }

        private string GetZoneInWords(int time)
        {
            string timeOfDay = "";
            if (time.Equals(6))
                timeOfDay = "Morning";
            else if (time.Equals(12))
                timeOfDay = "Day";
            else if (time.Equals(17))
                timeOfDay = "Evening";
            else if (time.Equals(23))
                timeOfDay = "Night";

            return timeOfDay + " parking";
        }
    }

1 Ответ

4 голосов
/ 25 июля 2011

Переберите все «часовые пояса», и для каждого из них определите перекрытие между ним и парковкой клиента.Например, в качестве псевдокода:

private static TimeSpan FindOverlap(ParkingTime parkingTime, TimeZone timeZone)
{
    // Handle wraparound zones like 23-6. Note that this doesn't attempt
    // to handle *parking* which starts at 11.30pm etc.
    if (timeZone.Start > timeZone.End)
    {
        return FindOverlap(parkingTime,
                     new TimeZone(timeZone.Start.Date, timeZone.End)
             + FindOverlap(parkingTime,
                     new TimeZone(timeZone.End, timeZone.Start.Date.AddDays(1));
    }

    DateTime overlapStart = Max(parkingTime.Start, timeZone.Start);
    DateTime overlapEnd = Min(parkingTime.End, timeZone.End);
    TimeSpan overlap = overlapEnd - overlapStart;

    // If the customer arrived after the end or left before the start,
    // the overlap will be negative at this point.
    return overlap < TimeSpan.Zero ? TimeSpan.Zero : overlap;
}

private static DateTime Min(DateTime x, DateTime y)
{
    return x < y ? x : y;
}

private static DateTime Max(DateTime x, DateTime y)
{
    return x > y ? x : y;
}

Кстати, я бы настоятельно рекомендовал бы вам переименовать вашу концепцию "часового пояса", учитывая, что она уже имеет хорошо известную(если не совсем понятно :) значение.

Возможно, вам следует назвать это ParkingInterval?Или ParkingPriceInterval если разница действительно с точки зрения стоимости?

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