2010-04-29 3 views
21

Je veux juste ajouter 1 jour à un DateTime. Alors, je l'ai écrit:Ajouter un TimeSpan à un DateTime donné

DateTime date = new DateTime(2010, 4, 29, 10, 25, 00); 
TimeSpan t = new TimeSpan(1, 0, 0, 0); 

date.Add(t); 

Console.WriteLine("A day after the day: " + date.ToString()); 

Je pensais que le résultat serait: 2010 04 30- 10:25:00 mais je reçois toujours la date initiale.

Qu'est-ce qui ne va pas?

Répondre

51

valeurs DateTime sont immuables . La méthode Add renvoie une nouvelle valeur DateTime avec le TimeSpan ajouté.

Cela fonctionne:

Console.WriteLine("A day after the day: " + date.Add(t).ToString()); 
+0

Merci. J'ai résolu mon problème! –

+0

vous pourriez vouloir accepter cette réponse –

+0

Oui.Je vais. J'ai juste une restriction, SO ne me laisse pas le faire avant 11minutes. Je ne sais pas pourquoi .. –

5

Quel est le problème avec simplement faire date = date.AddDays(1)?

+0

a toujours le même problème - DateTimes sont immuables :) –

+0

Mon Delta Le temps est un TimeSpan. Donc je ne peux pas utiliser AddDays qui prend un entier comme paramètre. –

+0

@Amokrane, si votre delta est un laps de temps, je pense que vous devriez reformuler le titre de la question. –

15

Vous devez changer une ligne:

date = date.Add(t); 
5

Le résultat de date.Add (t) est ce que vous êtes après:

DateTime date = new DateTime(2010, 4, 29, 10, 25, 00); 
TimeSpan t = new TimeSpan(1, 0, 0, 0); 

// The change is here, setting date to be the *new* date produced by calling Add 
date = date.Add(t); 

Console.WriteLine("A day after the day: " + date.ToString()); 
7

DateTime est immuable, mais le Additionner et Soustraire fonctions return new DateTimes pour vous d'utiliser.

DateTime tomorrow = DateTime.Now.AddDays(1); 
2
date.Add(t); 

retourne un DateTime modifié et ne change pas l'instance d'origine que vous appelez la méthode Add sur.

8

dtb a raison sur DateTime étant immuable. Pensez-y de cette façon: un DateTime est un type de valeur, ce qui le place dans la même catégorie que int ou double. Les instances de ces structures ne peuvent pas être modifiées; ils ne peuvent être évalués et copiés.

Tenir compte de ce code:

int i = 4; 

i + 2;  // does not compile, but what if it did? 
      // would i become 6? clearly not -- 
      // i + 2 expresses a NEW value, which can 
      // be copied somewhere 

i = i + 2; // there we go -- that's better 

Ceci est analogue à:

DateTime d = DateTime.Now; 
TimeSpan t = TimeSpan.FromDays(1.0); 

d.Add(t);  // compiles (because AddDays is a function), 
       // but is really the same as i + 2 above 

d = d.Add(t); // that's better 

Par ailleurs, une chose qui pourrait aider à rendre cela plus clair se rend compte que la ligne ci-dessus, d = d.Add(t), est identique à d = d + t. Et vous n'écririez pas d + t sur sa propre ligne, tout comme vous n'écririez pas i + 2 sur sa propre ligne.

1

DateTime ne fonctionne pas si le type de données obj DateTime est "DateTime?" qui prend accepte des valeurs nulles, dans ce cas DateTime? dt = DateTime.Now;

 DateTime dateObj = new DateTime(); 

     dateObj = Convert.ToDateTime(dt.ToString()); 

     var Month3 = dateObj.AddMonths(3);`