Subtrahieren Sie Tage von einer DateTime


142

Ich habe den folgenden Code in meinem C # -Programm.

DateTime dateForButton =  DateTime.Now;  
dateForButton = dateForButton.AddDays(-1);  // ERROR: un-representable DateTime

Immer wenn ich es ausführe, wird folgende Fehlermeldung angezeigt:

Der addierte oder subtrahierte Wert führt zu einer nicht darstellbaren DateTime.
Parametername: Wert

Ich habe diese Fehlermeldung noch nie gesehen und verstehe nicht, warum ich sie sehe. Aus den Antworten, die ich bisher gelesen habe, geht hervor, dass ich -1 in einer Additionsoperation verwenden kann, um Tage zu subtrahieren, aber wie meine Frage zeigt, ist dies bei dem, was ich versuche, nicht der Fall.


Sollte funktionieren, ist dies der Problembereich?
V4Vendetta

1
es muss funktionieren, sehe kein Problem damit ...
Tigran

12
Dieser Fehler tritt normalerweise auf, wenn Sie versuchen, ein Intervall von zu subtrahieren DateTime.MinValueoder etwas hinzuzufügen DateTime.MaxValue(oder wenn Sie versuchen, ein Datum außerhalb dieses Min-Max-Intervalls zu instanziieren). Sind Sie sicher, dass Sie nicht MinValueirgendwo zuweisen ?
CyberDude

1
CyberDude, Ihr Kommentar ist in der Tat Antwort. Wie kann ich über Ihren Kommentar abstimmen und ihn als Antwort zuweisen?
Buena

1
Bitte posten Sie den Code zwischen den Zeilen 2 und 3 Ihres Codes
Panagiotis Kanavos

Antworten:


70

Dieser Fehler tritt normalerweise auf, wenn Sie versuchen, ein Intervall von zu subtrahieren DateTime.MinValueoder etwas hinzuzufügen DateTime.MaxValue(oder wenn Sie versuchen, ein Datum außerhalb dieses Min-Max-Intervalls zu instanziieren). Sind Sie sicher, dass Sie nicht MinValueirgendwo zuweisen ?


287
DateTime dateForButton = DateTime.Now.AddDays(-1);

14
Diese Antwort, beantworten Sie den Titel des Themas. Dies sollte niemals herabgestuft werden. Die meisten Leute kommen von Google hierher. Wenn jemand mit dieser Antwort nicht einverstanden ist, sollte er eine Bearbeitung des Thementitels anbieten. ¬¬
MarceloBarbosa

Arbeitete sogar über Monate für mich.
David Jones

48

Du kannst tun:

DateTime.Today.AddDays(-1)

38

Sie können den folgenden Code verwenden:

dateForButton = dateForButton.Subtract(TimeSpan.FromDays(1));

4
Dies schlägt auch fehl, wenn das Datum DateTime.MinValue lautet. AddDays (-1) funktioniert genauso gut
Panagiotis Kanavos

7

Das dateTime.AddDays(-1) subtrahiert diesen einen Tag nicht von der dateTimeReferenz. Es wird eine neue Instanz zurückgegeben, wobei dieser eine Tag von der ursprünglichen Referenz abgezogen wird.

DateTime dateTime = DateTime.Now;
DateTime otherDateTime = dateTime.AddDays(-1);

Möchten Sie erklären, wie dies das Problem des OP lösen würde? Fast jeder kann Code schreiben, das ist der einfache Teil. (In diesem Fall sehe ich jedoch nicht, wie dies das Problem des OP überhaupt lösen würde.)
Vier Mitternacht,


4

Das Objekt (dh die Zielvariable) für die AddDays-Methode kann nicht mit der Quelle identisch sein.

Anstatt:

DateTime today = DateTime.Today;
today.AddDays(-7);

Versuchen Sie stattdessen Folgendes:

DateTime today = DateTime.Today;
DateTime sevenDaysEarlier = today.AddDays(-7);

1
Diese Antwort bringt keinen neuen Punkt, wenn wir uns die anderen vorhandenen Antworten ansehen.
Isuka

0

Verwenden von AddDays(-1) hat bei mir funktioniert, bis ich versucht habe, Monate zu überqueren. Als ich versuchte, 2 Tage vom 01.01.2017 abzuziehen, war das Ergebnis 2016-00-30. Es konnte die Monatsänderung nicht richtig handhaben (obwohl das Jahr in Ordnung zu sein schien).

Ich habe verwendet date = Convert.ToDateTime(date).Subtract(TimeSpan.FromDays(2)).ToString("yyyy-mm-dd"); und habe keine Probleme.


0

Anstatt die Anzahl der Tage direkt vom Datumsobjekt direkt zu verringern, erhalten Sie zuerst den Datumswert und subtrahieren dann die Tage. Siehe Beispiel unten:

DateTime SevenDaysFromEndDate = someDate.Value.AddDays(-1);

Hier ist someDate eine Variable vom Typ DateTime.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.