Como posso clonar um objeto DateTime em C #?

89

Como posso clonar um objeto DateTime em C #?

Iain
fonte
6
Por que você precisaria clonar um DateTime, é imutável.
Lukazoid

Respostas:

202

DateTime é um tipo de valor ( struct)

Isso significa que o seguinte cria uma cópia:

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

Você também pode fazer coisas com segurança como:

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());
  }
}

Observe como no último exemplo myDateTimeé declarado novamente a cada ciclo; se dateReferencetivesse sido afetado por AddHours()ou AddMinutes(), myDateTimeteria se afastado muito rápido - mas não é, porque dateReferencefica parado:

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
fonte
26
var original = new DateTime(2010, 11, 24);
var clone = original;

DateTimeé um tipo de valor, portanto, ao atribuí-lo, você também o clona. Dito isso, não há sentido em cloná-lo porque é imutável; normalmente, você só clonaria algo se tivesse a intenção de alterar uma das cópias.

Greg Beech
fonte
1
+1 aprovado. A maneira como eu contornei o problema foi criar um novo objeto DateTime e apenas copiar as partes necessárias que eu queria clonar, como (dia, mês, ano) do objeto datetime original e, em seguida, definir a hora manualmente para o novo objeto. .. como um exemplo.
Dal
12

DateTime é um tipo de valor, portanto, toda vez que você o atribui a uma nova variável, você está clonando.

DateTime foo = DateTime.Now;
DateTime clone = foo;
Darin Dimitrov
fonte