Soustraire des jours d'un DateHeure

142

J'ai le code suivant dans mon programme C #.

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

Chaque fois que je l'exécute, j'obtiens l'erreur suivante:

La valeur ajoutée ou soustraite entraîne un DateTime non représentable.
Nom du paramètre: valeur

Je n'ai jamais vu ce message d'erreur auparavant, et je ne comprends pas pourquoi je le vois. D'après les réponses que j'ai lues jusqu'à présent, je suis amené à croire que je peux utiliser -1 dans une opération d'ajout pour soustraire des jours, mais comme ma question le montre, ce n'est pas le cas de ce que j'essaie de faire.

Buena
la source
Devrait fonctionner, est-ce le problème?
V4Vendetta
1
ça doit marcher, ne vois aucun problème avec ça ...
Tigran
12
Cette erreur se produit généralement lorsque vous essayez de soustraire un intervalle de DateTime.MinValueou que vous souhaitez ajouter quelque chose DateTime.MaxValue(ou que vous essayez d'instancier une date en dehors de cet intervalle min-max). Êtes-vous sûr de ne pas attribuer MinValuequelque part?
CyberDude
1
CyberDude, votre commentaire est en fait Answer. Comment puis-je voter sur votre commentaire et l'attribuer comme réponse?
Buena
1
Veuillez poster le code entre les lignes 2 et 3 de votre code
Panagiotis Kanavos

Réponses:

70

Cette erreur se produit généralement lorsque vous essayez de soustraire un intervalle de DateTime.MinValueou que vous souhaitez ajouter quelque chose DateTime.MaxValue(ou que vous essayez d'instancier une date en dehors de cet intervalle min-max). Êtes-vous sûr de ne pas attribuer MinValuequelque part?

CyberDude
la source
287
DateTime dateForButton = DateTime.Now.AddDays(-1);
christiandev
la source
14
Cette réponse, répondez au titre du sujet. Cela ne devrait jamais être critiqué. La plupart des gens viennent ici de Google. Si quelqu'un n'est pas d'accord avec cette réponse, vous devez proposer une modification du titre du sujet. ¬¬
MarceloBarbosa
A travaillé pour moi même pendant des mois.
David Jones
48

Tu peux faire:

DateTime.Today.AddDays(-1)
sam
la source
38

Vous pouvez utiliser le code suivant:

dateForButton = dateForButton.Subtract(TimeSpan.FromDays(1));
Rajesh Subramanian
la source
4
Cela échouera également si la date est DateTime.MinValue. AddDays (-1) fonctionne aussi bien
Panagiotis Kanavos
7

Le dateTime.AddDays(-1) ne soustrait pas ce jour de la dateTimeréférence. Il renverra une nouvelle instance, avec ce jour soustrait de la référence d'origine.

DateTime dateTime = DateTime.Now;
DateTime otherDateTime = dateTime.AddDays(-1);
cahit beyaz
la source
Voulez-vous expliquer comment cela résoudrait le problème du PO? Presque tout le monde peut écrire du code, c'est la partie la plus simple. (Cependant, dans ce cas, je ne vois pas vraiment comment cela résoudrait le problème de l'OP du tout.)
fourpastmidnight
5

J'ai eu des problèmes avec AddDays (-1) .

Ma solution est TimeSpan .

DateTime.Now - TimeSpan.FromDays(1);
Nom d'utilisateur non trouvé
la source
Quel était votre problème exact?
Arash.Zandi
4

L'objet (c'est-à-dire la variable de destination) de la méthode AddDays ne peut pas être le même que la source.

Au lieu de:

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

Essayez plutôt ceci:

DateTime today = DateTime.Today;
DateTime sevenDaysEarlier = today.AddDays(-7);
Mark Benson
la source
1
Cette réponse n'apporte pas vraiment de nouveau point si l'on regarde les autres réponses existantes.
Isuka
1

Au lieu de réduire directement le nombre de jours à partir de l'objet de date, obtenez d'abord la valeur de la date, puis soustrayez les jours. Voir l'exemple ci-dessous:

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

Ici, someDate est une variable de type DateTime.

Sambhav jain
la source
0

En utilisant AddDays(-1) fonctionné pour moi jusqu'à ce que j'essaye de traverser des mois. Lorsque j'ai essayé de soustraire 2 jours du 01/01/2017, le résultat était 2016-00-30. Il ne pouvait pas gérer correctement le changement de mois (même si l'année semblait bien).

J'ai utilisé date = Convert.ToDateTime(date).Subtract(TimeSpan.FromDays(2)).ToString("yyyy-mm-dd"); et n'ai aucun problème.

Ainsley Hobart
la source