Sottrai giorni da un DateTime


142

Ho il seguente codice nel mio programma C #.

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

Ogni volta che lo eseguo, viene visualizzato il seguente errore:

Il valore aggiunto o sottratto risulta in un DateTime non rappresentabile.
Nome parametro: valore

Non ho mai visto questo messaggio di errore prima e non capisco perché lo vedo. Dalle risposte che Iv'e ha letto finora, sono portato a credere che posso usare -1 in un'operazione di aggiunta per sottrarre giorni, ma come la mia domanda mostra che questo non è il caso di ciò che sto tentando di fare.


Dovrebbe funzionare, è questa l'area problematica?
V4Vendetta,

1
si deve al lavoro, non vedo alcun problema con questo ...
Tigran

12
Questo errore si verifica in genere quando si tenta di sottrarre un intervallo da DateTime.MinValueo si desidera aggiungere qualcosa DateTime.MaxValue(o si tenta di creare un'istanza di una data al di fuori di questo intervallo min-max). Sei sicuro di non assegnare MinValueda qualche parte?
CyberDude,

1
CyberDude, il tuo commento è in realtà la risposta. Come posso votare il tuo commento e assegnarlo come risposta?
Buena,

1
Si prega di inserire il codice tra le righe 2 e 3 del codice
Panagiotis Kanavos il

Risposte:


70

Questo errore si verifica in genere quando si tenta di sottrarre un intervallo da DateTime.MinValueo si desidera aggiungere qualcosa DateTime.MaxValue(o si tenta di creare un'istanza di una data al di fuori di questo intervallo min-max). Sei sicuro di non assegnare MinValueda qualche parte?


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

14
Questa risposta, rispondi al titolo dell'argomento. Questo non dovrebbe mai essere sottovalutato. La maggior parte delle persone viene qui da Google. Se qualcuno non è d'accordo con questa risposta dovrebbe offrire una modifica sul titolo dell'argomento. ¬¬
MarceloBarbosa,

Ha funzionato per me anche per mesi.
David Jones,

48

Tu puoi fare:

DateTime.Today.AddDays(-1)

38

Puoi usare il seguente codice:

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

4
Ciò fallirà anche se la data è DateTime.MinValue. AddDays (-1) funziona altrettanto bene
Panagiotis Kanavos il

7

Questo dateTime.AddDays(-1) non sottrae un giorno dal dateTimeriferimento. Restituirà una nuova istanza, con quel giorno sottratto dal riferimento originale.

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

Vuoi spiegare come ciò risolverebbe il problema del PO? Quasi tutti possono scrivere codice, questa è la parte facile. (Tuttavia, in questo caso, in realtà non vedo come questo risolva il problema del PO.)
fourpastmidnight

5

Ho avuto problemi con AddDays (-1) .

La mia soluzione è TimeSpan .

DateTime.Now - TimeSpan.FromDays(1);

Qual è stato il tuo problema esatto?
Arash.Zandi,

4

L'oggetto (ovvero la variabile di destinazione) per il metodo AddDays non può essere lo stesso dell'origine.

Invece di:

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

Prova questo invece:

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

1
Questa risposta non porta davvero un nuovo punto se stiamo cercando le altre risposte esistenti.
Isuka,

1

Invece di diminuire direttamente il numero di giorni dall'oggetto data direttamente, prima ottieni il valore della data quindi sottrai i giorni. Vedi l'esempio seguente:

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

Qui, someDate è una variabile di tipo DateTime.


0

L'utilizzo ha AddDays(-1)funzionato per me fino a quando non ho provato ad attraversare mesi. Quando ho provato a sottrarre 2 giorni dall'01 / 01/2017, il risultato è stato 2016-00-30. Non è stato in grado di gestire correttamente il cambio di mese (anche se l'anno sembrava andare bene).

Ho usato date = Convert.ToDateTime(date).Subtract(TimeSpan.FromDays(2)).ToString("yyyy-mm-dd"); e non ho problemi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.