C #: пограничные случаи при удалении подмножества дня из TimeSpan на ежедневной основе - PullRequest
0 голосов
/ 01 сентября 2010

Я пытаюсь определить интервал времени (например, время между выходом из системы и входом в систему), но с оговоркой, что часть каждого дня не должна учитываться (например, не считать время между 7 вечера и7 утра в определенный день).Удаление этого времени из полных дней достаточно просто, но как лучше всего проверить часть дня (например, пользователь выходит из системы в 6 вечера и снова в 8 вечера того же дня) и другие пограничные случаи?

ETA: в настоящее время у меня есть установка, которая выглядит следующим образом:

public class HasProductiveHours
{
    //These fields should represent an hour of the day (in 24-hour format)
    // in which production should start or stop.
    public int startProductiveHour;
    public int endProductiveHour;
    //Resource type enum
    public ResourceType resourceType
    //How often this resource is collected, in seconds
    public float harvestTime

    public HasProductiveHours (int startProductiveHour, int endProductiveHour, ResourceType resourceType, int harvestTime)
    {
        // Other creation-time things
        this.startProductiveHour = startProductiveHour;
        this.endProductiveHour = endProductiveHour;
        this.resourceType = resourceType;
        this.harvestTime = harvestTime;
        TimeSimulator.Instance.SimulateElapsedTime (this);
    }
}

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

DateTime lastLogoutTime;

public void Logout ()
{
    // Other logout things
    lastLogoutTime = DateTime.Now;
}

public void SimulateElapsedTime (HasProductiveHours toSimulate)
{
    DateTime currentTime = DateTime.Now;
    TimeSpan timeSinceLogout = currentTime - lastLogout;
    int unproductiveHours = Math.Abs (toSimulate.startProductionHour - toSimulate.endProductionHour) * timeSinceLogout.Days;
    timeSinceLogout.Subtract (new TimeSpan (unproductiveHours, 0, 0);
    double secondsElapsed = timeSinceLogout.TotalSeconds;
int harvestsElapsed = (int)(secondsElapsed / toSimulate.harvestTime);
PlayerData.Instance.AddResource (toSimulate.resourceType, harvestsElapsed);
}

Ответы [ 2 ]

2 голосов
/ 01 сентября 2010

Это легко исправить несколькими шагами:

  1. Проверьте время выхода из системы - посмотрите, будет ли оно между 7 и 7 часами вечера (метод часа дает вам количество часов с полуночи.хотите увидеть, если это> = 7 и <= 19).Если это не так, перенесите время на 7 утра.Это должно быть достаточно легко сделать - если время <7 утра, измените время на 7 утра.Если время больше 19:00, замените время на 7:00 следующего дня </p>

  2. Проверьте время входа в систему - посмотрите, будет ли оно между 7:00 и 19:00.Если это не так, переведите время обратно в 7 вечера.Это должно быть достаточно легко сделать - если час> 7 вечера, установите его на 7 вечера, если час <7 утра, измените время на 7 вечера предыдущего дня </p>

  3. Проверьте, чтобы убедиться, чтовремя выхода <время входа.Если нет, то все время выхода из системы было в течение часов без подсчета, поэтому ваш интервал времени должен быть установлен равным 0. Если ваше время выхода из системы <вход в систему, просто вычтите их, чтобы получить ваш временной интервал </p>

Это для ситуации, описанной в комментарии:

Если номера дней совпадают, я бы предпринял следующие шаги:

  1. Создайте новое время и дату сдата выхода из системы и время 1900. Вычтите новую дату из даты выхода из системы - это даст вам промежуток времени до конца дня

  2. Переместите дату выхода в 7 утра.следующий день.Если выход из системы и вход в систему осуществляются в один и тот же день, просто вычтите выход из учетной записи, это промежуток времени для этого дня.Если они не совпадают с датой, повторите шаг 1

  3. Сложите временные интервалы, созданные на шаге 1 и шаге 2 вместе.Это дает ваше общее время

Например: я выхожу 1 января в 16:00.Я вхожу в систему 2 января, в 10:00

Время выхода из системы 1 января в часы отслеживания составляет 3 часа (1 января, 19:00 - 1 января, 16:00)

Iперенести время выхода на 2 января в 07:00.

день выхода из системы 2, а день входа в систему 2, теперь я могу вычесть их

время выхода из системы2 января в часы отслеживания - 3 часа (2 января, 10:00 - 2 января, 07:00)

Теперь я добавляю их вместе и получаю 6 часов времени выхода из системы в часы отслеживания.

0 голосов
/ 02 сентября 2010

@ thorkia предлагает несколько хороших предложений.

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

Итак

8 утра - 6 утра = всего 2 часа

6 утра до 7 утра = 1 час без времени

результат = 1 час всего в реальном времени

...