Anzahl der Tage im Datumsbereich, ausgenommen Wochenenden und andere Daten in C #

7

Ich habe eine C # -Methode wie folgt:

%Vor%

Was es tun soll, ist die Anzahl der Tage zwischen startDate und endDate zu berechnen, aber optional müssen Wochenenden und auch andere Daten (die als kommagetrennte Datumsfolge übergeben werden) ausgeschlossen werden.

Ich habe absolut keine Ahnung, wie ich das angehen soll. Mein Bauchgefühl wäre es, von StartDate zu EndDate zu loopen und einige String-Vergleiche zu machen, aber von dem, was ich herausfinden kann, erlaubt C # kein Durchlaufen von Daten auf diese Art - oder zumindest ist es keine sehr elegante Art, Dinge zu tun.

    
Dan 30.06.2011, 16:10
quelle

7 Antworten

8

Hier ist ein Beispiel, das die ausgeschlossenen Daten, Wochenenden und Schleifen enthält. Ich habe jedoch die Zeichenfolge excludeDates in eine Liste geändert. Einige Null-Überprüfung sollte hinzugefügt werden.

%Vor%

EDIT: Ich möchte darauf hinweisen, dass ich dies als die schnelle und schmutzige Methode betrachten würde - wenn Sie das nicht oft machen müssten. Wenn Sie dies sehr oft durchführen und der Abstand zwischen startDate und endDate ziemlich groß ist, wäre es viel besser, die Mathematik wie in einer der anderen Antworten angegeben durchzuführen. Dies wird vorgeschlagen, um ein Gefühl für die Wiederholung von Daten zu bekommen.

    
McAden 30.06.2011, 16:29
quelle
10

Oh, es ist wirklich einfach, die Daten zu durchlaufen - das ist überhaupt kein Problem:

%Vor%

Sie könnten auch einfach ein IEnumerable<DateTime> schreiben und foreach verwenden.

Ich würde versuchen, string -Operationen hier zu vermeiden, wenn es möglich ist - im Grunde sind diese Daten keine Strings, also wenn Sie in der Problemdomäne so weit wie möglich arbeiten können, wird es machen Dinge einfacher.

Natürlich kann es durchaus effizientere Wege geben als Looping, aber sie werden schwieriger zu korrigieren sein. Wenn die Schleife in Bezug auf die Leistung in Ordnung ist, bleibe ich dabei.

Als Schnellstart für mein eigenes Open-Source-Projekt hat Noda Time eine etwas breitere Gruppe von Typen, die Datum und Uhrzeit repräsentieren - In diesem Fall würden Sie LocalDate verwenden. Auf diese Weise müssen Sie sich keine Gedanken darüber machen, was passiert, wenn die Zeit in "Start" später ist als die Zeit in "Ende" usw. Andererseits ist Noda Time noch nicht wirklich fertig ... die Bits, die Sie brauchen dafür sind bereit und sollte gut funktionieren, aber es ist möglich, dass die API in der Zukunft noch ändern könnte.

BEARBEITEN: Wenn Sie tun müssen häufig Daten durchlaufen, möchten Sie vielleicht etwas wie diese Erweiterungsmethode (setzen Sie es in eine Top-Level nicht-generische statische Klasse):

%Vor%

Dann:

%Vor%     
Jon Skeet 30.06.2011 16:14
quelle
1

Die Subsonic Zuckerbibliothek hat viele Helfer, um die DateTime Manipulation zu handhaben.

Sie finden eine vollständige Liste auf der Subsonic-Site und der Quellcode befindet sich in github .

    
marto 30.06.2011 16:13
quelle
0

Hier ist Pseudocode für einen anderen Ansatz, den ich in SQL verwendet habe:

Ermitteln Sie die Gesamtzahl der Tage zwischen den beiden Daten
Subtrahieren Sie die Anzahl der Wochenenden Entfernen Sie einen Tag, wenn das Startdatum ein Sonntag ist Entfernen Sie einen Tag, wenn das Startdatum ein Samstag ist Entferne alle anderen Tage, die du nicht möchtest (siehe oben meinen Kommentar dazu, wie das in c # gemacht wird)

    
macleojw 30.06.2011 16:27
quelle
0

Dies könnte funktionieren und eine Lösung vom Typ O (n) vermeiden:

%Vor%

Es ist jedoch nicht erschöpfend getestet.

Um mit den Ausschlussterminen fertig zu werden, können Sie diese durchlaufen und ausschließen, wo sie sich zwischen Anfang und Ende befinden (und gegebenenfalls kein Wochenende). Dies sollte eine kürzere Schleife sein, als alle Tage zwischen Start und Ende durchzugehen.

    
Jon Egerton 30.06.2011 16:41
quelle
0

Kombiniere mit LINQ-Ausdrücken,

%Vor%     
Jedi Dula 08.03.2014 18:18
quelle
0
%Vor%     
dbhukta 20.09.2017 05:08
quelle

Tags und Links