Определить, находится ли текущее время в нескольких временных диапазонах

1

Я написал простое приложение, отображающее текущее время (HH: MM). Отображаемое время обновляется каждую секунду DispatcherTimer.

Учитывая, что у меня есть файл конфигурации в формате XML, который содержит список часов, которые должны быть отображены в другом цвете в течение 5 минут:

Пример:

  • 08:15 → выделено с 8:15 до 8:20 включительно
  • 10:20 → выделено с 10:20 до 10:25 включительно
  • 11:55 → выделено с 11:55 до 12:00 включительно
  • 14:15 → выделено с 14:15 до 14:20 включительно
  • 16:05 → выделено с 16:05 до 16:10 включительно

Но если есть "перекрывающиеся" возможности, например:

  • 8:10
  • 8:12

Затем время должно быть выделено с 8:15 до 08:17

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

Вы будете генерировать сначала список со всеми начальными + конечными временами для каждой записи и проверять фактическое время против этого списка каждую секунду? (зацикливание всех значений списка каждую секунду)? : -/

Или вы достигнете этого по-другому и как?

EDIT: Вот что сделано до сих пор:

private enum DisplayState
{
    /// <summary>
    /// The application has just been started or reset due to changes to the configuration file
    /// </summary>
    Initial,

    /// <summary>
    /// The current displayed time is highlighed
    /// </summary>
    Highlighted,

    /// <summary>
    /// The current displayed time is not highlighed
    /// </summary>
    Normal
};

DisplayState _lastDisplayState = DisplayState.Initial;

// The list that retrieves the hours from the XML file as string values ("HH:MM")
// Note: this can be changed into a list of TimeSpan or anything else in a near future
private List<string> _hourList;

private DispatcherTimer _dispatcherTimer;

...

/// <summary>
/// What happens each second
/// </summary>
private void dispatcherTimerTick(object sender, EventArgs e)
{
    // Store current time
    _timeToDisplay = DateTime.Now.ToString("HH:mm");

    // Refresh displayed time
    tbDigitalClock.Text = tbDigitalClockBack.Text = _timeToDisplay;

    PlaceWindow();

    // Check if our list of hours contain current time
    // Note: for the moment _hourList is a list of strings (hours from the XML file)
    if (_hourList.Contains(_timeToDisplay))
    {
        // Only change appearance once if display state changed
        if (_lastDisplayState != DisplayState.Highlighted)
        {
            _lastDisplayState = DisplayState.Highlighted;

            // Play sound alert if desired
            if (_playSound)
                _soundPlayer.Play();

            // Highlight current displayed time
            tbDigitalClock.Foreground = Brushes.Yellow;
            tbDigitalClockBack.Foreground = Brushes.Black;
            mainBorder.Background = _highlightedBackColor;
            mainBorder.BorderBrush = Brushes.Red;
        }
    }
    else
    {
        if (_lastDisplayState != DisplayState.Normal)
        {
            _lastDisplayState = DisplayState.Normal;

            // Turn displayed time appearance back to normal
            tbDigitalClock.Foreground = _defaultTextColor;
            tbDigitalClockBack.Foreground = _defaultTextBackColor;
            mainBorder.Background = Brushes.Transparent;
            mainBorder.BorderBrush = Brushes.Transparent;
        }
    }
}

Файл XML выглядит так:

<DigiClock>
    <Config PlaySound="true" />
    <Breaks>
        <Time>10:00</Time>
        <Time>12:00</Time>
        <Time>14:30</Time>
        <Time>16:30</Time>
    </Breaks>
</DigiClock>

Спасибо заранее! ;-)

Теги:
datetime
time
range
timespan

1 ответ

0

Как представляется, вы кодируете приложение GUI, я бы пошел с таймером с интервалом, установленным в 1 секунду (или, может быть, 5 секунд достаточно или что-то промежуточным?) И с обработчиком событий, подобным этому (непроверенным):

TimeSpan t = new TimeSpan(0, 5, 0); // five minutes
List<DateTime> _hourList;
bool _soundPlayed = false;

private void OnTimerTick()
{
    DateTime now = DateTime.Now;
    foreach (var h in _hourList)
    {
        if ((now >= h) && (now <= (h + t)))
        {
            if (_lastDisplayState != DisplayState.Highlighted)
            {
                _lastDisplayState = DisplayState.Highlighted;
                ...
            }

            if (!_soundPlayed)
            {
                _soundPlayed = true;
                _soundPlayer.Play();
            }
            return;
        }
    }

    // if code runs until here, we are out of any highlighted moment
    _soundPlayed = false;
    if (_lastDisplayState != DisplayState.Normal)
    {
        _lastDisplayState = DisplayState.Normal;
        ...
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню