Ich möchte den ersten und letzten Tag des Monats abrufen, an dem ein bestimmtes Datum liegt. Das Datum stammt von einem Wert in einem UI-Feld.
Wenn ich einen Zeitwähler benutze, könnte ich sagen
var maxDay = dtpAttendance.MaxDate.Day;
Aber ich versuche es von einem DateTime-Objekt zu bekommen. Also wenn ich das habe ...
DateTime dt = DateTime.today;
Wie komme ich zum ersten und letzten Tag des Monats dt
?
_Date
Variablen ist ein einzelner Wert gespeichert . Welche "Min und Max" versuchen Sie von diesem Wert zu bekommen?Antworten:
DateTime
Struktur speichert nur einen Wert, keinen Wertebereich.MinValue
undMaxValue
sind statische Felder, die einen Bereich möglicher Werte für Instanzen derDateTime
Struktur enthalten. Diese Felder sind statisch und beziehen sich nicht auf eine bestimmte Instanz vonDateTime
. Sie beziehen sich auf denDateTime
Typ selbst.Empfohlene Lektüre: statisch (C # -Referenz)
UPDATE: Monatsspanne abrufen:
quelle
lastDayofMonth
seinfirstDayOfMonth.AddMonths(1).AddSeconds(-1);
?AddTicks(-1)
, aber wenn wir uns nicht um Zeitteil kümmern und nur um Datumsteil denken, dann funktionieren Tage gut< firstDayOfNextMonth
statt<= lastDayOfMonth
. Auf diese Weise funktioniert es immer, unabhängig von der Granularität. (Ich bin sicher, Zecken werden in Ordnung sein, aber wer weiß, was die Zukunft bringt ... Nanoticks?)Dies ist eher ein langer Kommentar zu den Antworten von @Sergey und @ Steffen. Nachdem ich in der Vergangenheit selbst ähnlichen Code geschrieben hatte, entschied ich mich zu überprüfen, was am performantesten war, während ich mich daran erinnerte, dass Klarheit ebenfalls wichtig ist.
Ergebnis
Hier ist ein Beispiel für ein Testergebnis für 10 Millionen Iterationen:
Code
Ich habe LINQPad 4 (im C # -Programmmodus) verwendet, um die Tests mit aktivierter Compileroptimierung auszuführen. Hier ist der getestete Code, der aus Gründen der Klarheit und Bequemlichkeit als Erweiterungsmethode berücksichtigt wird:
Analyse
Einige dieser Ergebnisse haben mich überrascht.
Obwohl nicht viel drin ist,
FirstDayOfMonth_AddMethod
war das etwas schneller alsFirstDayOfMonth_NewMethod
in den meisten Testläufen. Ich denke jedoch, dass Letzteres eine etwas klarere Absicht hat, und deshalb bevorzuge ich das.LastDayOfMonth_AddMethod
war ein klarer Verlierer gegenLastDayOfMonth_AddMethodWithDaysInMonth
,LastDayOfMonth_NewMethod
undLastDayOfMonth_NewMethodWithReuseOfExtMethod
. Zwischen den schnellsten drei ist nicht viel drin und es kommt auf Ihre persönlichen Vorlieben an. Ich wähle die KlarheitLastDayOfMonth_NewMethodWithReuseOfExtMethod
mit der Wiederverwendung einer anderen nützlichen Erweiterungsmethode. IMHO ist seine Absicht klarer und ich bin bereit, die geringen Leistungskosten zu akzeptieren.LastDayOfMonth_SpecialCase
Angenommen, Sie geben den ersten des Monats in dem speziellen Fall an, in dem Sie dieses Datum möglicherweise bereits berechnet haben, und es verwendet die Add-Methode mitDateTime.DaysInMonth
, um das Ergebnis zu erhalten. Dies ist schneller als die anderen Versionen, wie Sie es erwarten würden, aber wenn Sie nicht dringend Geschwindigkeit brauchen, sehe ich keinen Sinn darin, diesen Sonderfall in Ihrem Arsenal zu haben.Fazit
Hier ist eine Erweiterungsmethodenklasse mit meinen Auswahlmöglichkeiten und in allgemeiner Übereinstimmung mit @Steffen glaube ich:
Wenn Sie so weit gekommen sind, danke für die Zeit! Es hat Spaß gemacht: ¬). Bitte kommentieren Sie, wenn Sie weitere Vorschläge für diese Algorithmen haben.
quelle
LastDayOfMonth_AddMethod_SpecialCase
(oder so ähnlich). Ich erwarte den ersten Tag des Monats als Parameter und denke, der schnellste sollte sein, was erLastDayOfMonth_AddMethod
tut! Das wäre also so einfach wie:return value.AddMonths(1).AddDays(-1);
Abrufen der Monatsreichweite mit der .Net-API (nur eine andere Möglichkeit):
quelle
"
Last day of month
" ist eigentlich "First day of *next* month, minus 1
". Also hier ist, was ich benutze, keine Notwendigkeit für "DaysInMonth" -Methode:HINWEIS: Der Grund, den ich hier verwende
AddMinutes(-1)
,AddDays(-1)
ist, dass Sie normalerweise diese Datumsfunktionen für benötigen Berichterstellung für einen bestimmten Zeitraum Wenn Sie einen Bericht für einen bestimmten Zeitraum erstellen, sollte das "Enddatum" tatsächlich so etwas wie seinOct 31 2015 23:59:59
damit Ihr Bericht ordnungsgemäß funktioniert - einschließlich aller Daten vom letzten Tag des Monats.Dh du bekommst tatsächlich den "letzten" Moment des Monats". Nicht am letzten Tag.
OK, ich werde jetzt die Klappe halten.
quelle
quelle
description
, das Ihnen bei der Erläuterung Ihres Codes hilft. DankeHier können Sie einen Monat für den ersten Tag des aktuellen Monats hinzufügen, als 1 Tag von diesem Tag zu löschen.
quelle
Wenn Sie sich nur um das Datum kümmern
Wenn Sie Zeit sparen möchten
quelle
Die hier akzeptierte Antwort berücksichtigt nicht die Art der DateTime-Instanz. Wenn Ihre ursprüngliche DateTime-Instanz beispielsweise eine UTC-Art war, erstellen Sie durch Erstellen einer neuen DateTime-Instanz eine Instanz unbekannter Art, die dann basierend auf den Servereinstellungen als Ortszeit behandelt wird. Daher ist der richtige Weg, um das erste und letzte Datum des Monats zu erhalten, folgender:
Auf diese Weise bleibt die ursprüngliche Art der DateTime-Instanz erhalten.
quelle
Probier diese:
quelle
Ich habe dies in meinem Skript verwendet (funktioniert für mich), aber ich brauchte ein vollständiges Datum, ohne es nur auf das Datum und keine Uhrzeit zuschneiden zu müssen.
quelle
Probieren Sie es aus. Es berechnet im Grunde die Anzahl der Tage, die vergangen sind
DateTime.Now
, subtrahiert dann einen davon und verwendet den neuen Wert, um den ersten des aktuellen Monats zu finden. Von dort verwendet es dasDateTime
und verwendet.AddMonths(-1)
, um den ersten des Vormonats zu erhalten.Das Abrufen des letzten Tages des letzten Monats bewirkt im Grunde dasselbe, außer dass die Anzahl der Tage im Monat um eins erhöht und dieser Wert abgezogen wird
DateTime.Now.AddDays
, sodass Sie den letzten Tag des vorherigen Monats erhalten.quelle
Für die persische Kultur
quelle
Du kannst es schaffen
quelle
einfache Möglichkeit, es zu tun
quelle
quelle