2009-08-20 10 views
1

DateTimeをコンストラクタ内に存在しないように、一度に1つずつC#で作成しようとしています。私は何が間違っているのか理解していない。そのd.YearsDateTimeを一度に構築する

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

依然としてかかわらず1に等しいであろう。また、私はに保存する必要があります。だから私は巨大なコンストラクタを使って日付を構築することはできませんし、永続的なDateTimeインスタンスを持つこともできないので、それを長時間ダンプしてから復元してから、0の値から始めます。ゼロとは違う値から始めると思いますか?

何が間違っていますか?

答えて

16

DateTime構造体は不変です。つまり、そのプロパティは変更できません。

AddYears方法は、あなたが使用する必要があり、新たな日時を返します。

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

+1不変説明のため。 –

1

のDateTimeコンストラクタのための12種類のオーバーロードがあります。あなたの用途に合わせて少なくとも1つは適応する必要があります。

この:あなたはアップフロントおよびその他のパラメータのためにゼロに置くことができるようちょうど日の限りを構築

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

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

がより優れています。

+0

構築時にdatetime全体がわからないので失敗します。 (それはページの更新を渡って構築されています) – Earlz

+0

あなたはポイントを逃しました:あなたはその時に知っている限りを使用し、他の場所にはゼロを入れます。 –

2

おそらくオフトピックですが、DateTimelongとして保存する必要がある場合は、そのTicksプロパティで返された値を保持してください。

あなたはその後、the constructor that takes a ticks parameterを使用してDateTimeインスタンスを復元することができます。

// 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

また、 'DateTimeKind'を保持することが重要な場合には、目盛りの代わりに' ToBinary'と 'FromBinary'メソッドを使うことを検討したいかもしれません。 – LukeH

0

あなたがそう DateTime d = new DateTime(); d d.AddYears(2000);

しかし、これは時間の新しいDateTimeの99.9%をインスタンス化しますようにそれを変更する必要がありますので、日時は不変ですこれは問題ありませんが、永遠に実行されるループでネストされている場合は、多くのDateTimeコンストラクタのいずれかを使用する方がよいでしょう。 stringとStringBuilderと同じ経験則を使用します。

関連する問題