Comment puis-je cloner un objet DateTime en C #?

89

Comment puis-je cloner un objet DateTime en C #?

Iain
la source
6
Pourquoi auriez-vous même besoin de cloner un DateTime, c'est immuable.
Lukazoid

Réponses:

203

DateTime est un type valeur ( struct)

Cela signifie que ce qui suit crée une copie:

DateTime toBeClonedDateTime = DateTime.Now;
DateTime cloned = toBeClonedDateTime;

Vous pouvez également faire des choses comme:

var dateReference = new DateTime(2018, 7, 29);
for (var h = 0; h < 24; h++) {
  for (var m = 0; m < 60; m++) {
    var myDateTime = dateReference.AddHours(h).AddMinutes(m);
    Console.WriteLine("Now at " + myDateTime.ToShortDateString() + " " + myDateTime.ToShortTimeString());
  }
}

Notez comment dans le dernier exemple myDateTimeest déclaré à nouveau dans chaque cycle; si dateReferenceavait été affecté par AddHours()ou AddMinutes(), se myDateTimeserait éloigné très vite - mais ce n'est pas le cas, car dateReferencereste en place:

Now at 2018-07-29 0:00
Now at 2018-07-29 0:01
Now at 2018-07-29 0:02
Now at 2018-07-29 0:03
Now at 2018-07-29 0:04
Now at 2018-07-29 0:05
Now at 2018-07-29 0:06
Now at 2018-07-29 0:07
Now at 2018-07-29 0:08
Now at 2018-07-29 0:09
...
Now at 2018-07-29 23:55
Now at 2018-07-29 23:56
Now at 2018-07-29 23:57
Now at 2018-07-29 23:58
Now at 2018-07-29 23:59
Pieter van Ginkel
la source
26
var original = new DateTime(2010, 11, 24);
var clone = original;

DateTimeest un type valeur, donc lorsque vous l'affectez, vous le clonez également. Cela dit, il ne sert à rien de le cloner car il est immuable; en général, vous ne cloneriez quelque chose que si vous aviez l'intention de changer l'une des copies.

Greg Beech
la source
1
+1 D'accord. La façon dont j'ai contourné le problème était de créer un nouvel objet DateTime et de copier simplement les parties requises que je voulais cloner, telles que (jour, mois, année) à partir de l'objet datetime d'origine, puis définir l'heure manuellement pour le nouvel objet. .. par exemple.
Dal
12

DateTime est un type valeur, donc chaque fois que vous l'assignez à une nouvelle variable que vous clonez.

DateTime foo = DateTime.Now;
DateTime clone = foo;
Darin Dimitrov
la source