web-dev-qa-db-fra.com

Ajout d'un TimeSpan à un DateTime donné

Je veux juste ajouter 1 jour à un DateTime. J'ai donc écrit:

 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?

26
Amokrane Chentir

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

Cela marche:

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

Vous devez changer de ligne:

date = date.Add(t);
16
Paddy

dtb a raison sur le fait que DateTime est 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.

Considérez 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

Soit dit en passant, une chose qui pourrait aider à rendre cela plus clair est de réaliser que la ligne ci-dessus, d = d.Add(t), est la même que 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.

11
Dan Tao

Un DateTime est immuable, mais les fonctions Ajouter et Soustraire renvoient de nouveaux DateTimes à utiliser.

DateTime tomorrow = DateTime.Now.AddDays(1);
7
Anthony Pegram

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

5

Le résultat de date.Add (t) est ce que vous recherchez:

 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());
5
Rob
date.Add(t);

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

2
Bala R

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

        DateTime dateObj = new DateTime();

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

        var Month3 = dateObj.AddMonths(3);`
1
Dpk-Kumar