2009-08-20 6 views
1

Je tente de construire un DateTime en C# une étape à la fois, comme dans, la date entière n'étant pas dans le constructeur. Je ne comprends pas ce qui ne va pas.Construction d'un horodatage étape par étape

DateTime d = new DateTime((long)0); 
d.AddYears(2000); 

avec cette d.Years sera toujours égale à 1 si. En outre, je doit stocker la date comme un long. Donc, je ne peux pas simplement construire la date avec un énorme constructeur et je ne peux pas avoir une instance de DateTime persistante, donc je la sauvegarde à long terme, puis la restaure et je commence par une valeur de 0. Suis-je supposé commencer avec une valeur différente de zéro?

qu'est-ce qui ne va pas?

Répondre

16

Une structure DateTime est immuable, ce qui signifie que ses propriétés ne peuvent pas changer.

La méthode AddYears retourne un nouveau DateTime que vous devez utiliser:

DateTime d = new DateTime((long)0); 
d = d.AddYears(2000); 
+0

+1 pour explication non modifiable. –

1

Il y a 12 différents pour le surcharge constructeur DateTime. Il devrait y en avoir au moins un que vous pouvez adapter pour votre usage.

Ce:

DateTime d = new DateTime(2000,0,0); 

est mieux que:

DateTime d = new DateTime((long)0); 
d = d.AddYears(2000); 

construire Tout comme une grande partie de la date que vous pouvez avant et mettre en zéros pour les autres paramètres.

+0

Je ne connais pas le datetime entier lorsqu'il est construit, donc cela échouerait. (Il est construit à travers les mises à jour de la page) – Earlz

+0

Vous avez manqué le point: vous utilisez autant que vous le savez à l'époque et mettez des zéros partout ailleurs. –

2

Probablement hors sujet, mais si vous devez persister votre DateTime en tant que long alors pourquoi ne pas conserver la valeur renvoyée par sa propriété Ticks.

Vous pouvez ensuite restaurer votre DateTime par exemple en utilisant the constructor that takes a ticks parameter:

// stage 1 
DateTime dt = DateTime.MinValue.AddYears(2009); 
PersistTicksToSomewhere(dt.Ticks); 

// stage 2 
long ticks = GetPersistedTicksFromSomewhere(); 
DateTime dt = new DateTime(ticks).AddMonths(8); 
PersistTicksToSomewhere(dt.Ticks); 

// stage 3 
long ticks = GetPersistedTicksFromSomewhere(); 
DateTime dt = new DateTime(ticks).AddDays(20); 
PersistTicksToSomewhere(dt.Ticks); 

// etc etc 
+0

Vous pouvez également envisager d'utiliser les méthodes 'ToBinary' et' FromBinary' au lieu de ticks si la préservation de 'DateTimeKind' est importante. – LukeH

0

DateTime est immuable et vous devez changer comme si DateTime d = new DateTime(); d d.AddYears(2000);

Toutefois, cela instancier un nouveau DateTime 99,9% du temps C'est bien, mais s'il est imbriqué dans une boucle qui tourne pour toujours, il vaut mieux utiliser l'un des nombreux constructeurs DateTime. Utilisez la même règle que String et StringBuilder.

Questions connexes