Ich muss wissen, ob ein Datum zwischen einem DateRange liegt. Ich habe drei Daten:
// The date range
DateTime startDate;
DateTime endDate;
DateTime dateToCheck;
Die einfache Lösung ist ein Vergleich, aber gibt es eine intelligentere Möglichkeit, dies zu tun?
c#
.net
datetime
date-range
Daniel Peñalba
quelle
quelle
Antworten:
Nein, ein einfacher Vergleich sieht für mich gut aus:
return dateToCheck >= startDate && dateToCheck < endDate;
Dinge, über die man nachdenken sollte:
DateTime
ist ein etwas seltsamer Typ in Bezug auf Zeitzonen. Es könnte UTC sein, es könnte "lokal" sein, es könnte mehrdeutig sein. Stellen Sie sicher, dass Sie Äpfel sozusagen mit Äpfeln vergleichen.quelle
DateTime
ist wichtig sicherzustellen, dass die von Ihnen verglichenen s von derselben Art sind (UTC / Lokal). Bei verschiedenen Arten wird die Rohzeit verglichen, anstatt beide in eine gemeinsame Art umzuwandeln.return startDate <= dateToCheck && dateToCheck < endDate
scheint etwas lesbarer.Normalerweise erstelle ich für solche Dinge die Fowler's Range- Implementierung.
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); } }
Die Verwendung ist ziemlich einfach:
DateRange range = new DateRange(startDate, endDate); range.Includes(date)
quelle
Sie können Erweiterungsmethoden verwenden, um die Lesbarkeit zu verbessern:
public static class DateTimeExtensions { public static bool InRange(this DateTime dateToCheck, DateTime startDate, DateTime endDate) { return dateToCheck >= startDate && dateToCheck < endDate; } }
Jetzt können Sie schreiben:
quelle
IsInRange()
als Funktionsname verwenden würdeSie können verwenden:
return (dateTocheck >= startDate && dateToCheck <= endDate);
quelle
Ich habe festgestellt, dass die folgende Bibliothek am hilfreichsten ist, wenn Sie eine Datumsberechnung durchführen. Ich bin immer noch erstaunt, dass nichts davon Teil des .Net-Frameworks ist.
http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
quelle
Im Anschluss an Sergeys Antwort , ich denke , die generische Ausführung mehr im Einklang mit Fowler ist
Range
Idee und löst einige der Probleme mit dieser Antwort wie in der Lage , das habenIncludes
Methoden innerhalb einer generischen Klasse von ZwangT
wieIComparable<T>
. Es ist auch unveränderlich, wie Sie es von Typen erwarten würden, die die Funktionalität anderer Werttypen wie erweiternDateTime
.public struct Range<T> where T : IComparable<T> { public Range(T start, T end) { Start = start; End = end; } public T Start { get; } public T End { get; } public bool Includes(T value) => Start.CompareTo(value) <= 0 && End.CompareTo(value) >= 0; public bool Includes(Range<T> range) => Start.CompareTo(range.Start) <= 0 && End.CompareTo(range.End) >= 0; }
quelle