Jak sprawdzić, czy DateTime jest pomiędzy DateRange w C#

Muszę wiedzieć, czy Data jest między DateRange. Mam trzy daty:

// The date range
DateTime startDate;
DateTime endDate;

DateTime dateToCheck;

Łatwym rozwiązaniem jest porównanie, ale czy jest na to mądrzejszy sposób?

Z góry dzięki.
Author: Daniel Peñalba, 2011-01-24

5 answers

Nie, Robienie prostego porównania wygląda mi dobrze:

return dateToCheck >= startDate && dateToCheck < endDate;

Things to thought about thought:

  • DateTime jest nieco dziwnym typem pod względem stref czasowych. Może być UTC, może być "lokalne", może być niejednoznaczne. Upewnij się, że porównujesz jabłka z jabłkami.
  • zastanów się, czy twoje punkty początkowe i końcowe powinny być włączone, czy wyłączne. Zrobiłem powyższy kod traktować go jako inclusive dolnej granicy i wyłącznej górnej granicy.
 98
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-24 11:50:12

Zazwyczaj tworzę implementację Fowler ' s Range dla takich rzeczy.

public interface IRange<T>
{
    T Start { get; }
    T End { get; }
    bool Includes(T value);
    bool Includes(IRange<T> range);
}

public class DateRange : IRange<DateTime>         
{
    public DateRange(DateTime start, DateTime end)
    {
        Start = start;
        End = end;
    }

    public DateTime Start { get; private set; }
    public DateTime End { get; private set; }

    public bool Includes(DateTime value)
    {
        return (Start <= value) && (value <= End);
    }

    public bool Includes(IRange<DateTime> range)
    {
        return (Start <= range.Start) && (range.End <= End);
    }
}

Użycie jest dość proste:

DateRange range = new DateRange(startDate, endDate);
range.Includes(date)
 53
Author: Sergey Berezovskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-01 11:20:38

Możesz użyć metod rozszerzeń, aby uczynić go trochę bardziej czytelnym:

public static class DateTimeExtensions
{
    public static bool InRange(this DateTime dateToCheck, DateTime startDate, DateTime endDate)
    {
        return dateToCheck >= startDate && dateToCheck < endDate;
    }
}

Teraz możesz napisać:

dateToCheck.InRange(startDate, endDate)
 33
Author: Elian Ebbing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-24 13:12:33

Możesz użyć:

return (dateTocheck >= startDate && dateToCheck <= endDate);
 7
Author: WraithNath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-24 11:50:50

Znalazłem poniższą bibliotekę, która jest najbardziej pomocna przy robieniu jakiejkolwiek matematyki Randkowej. Nadal jestem zdumiony, że nic takiego nie jest częścią. Net framework.

Http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET

 4
Author: landerud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 21:52:49