2017-06-20 11 views
1

は、以下の(簡体字)のコードを検討:私はnow2nowのフィールドをコピーしたのでこれら2つのDateTimeインスタンスが異なるのはなぜですか?

DateTime now = DateTime.Now; 
DateTime now2 = new DateTime(now.Year, now.Month, now.Day, 
           now.Hour, now.Minute, now.Second, 
           now.Millisecond, now.Kind); 
bool condition = (now <= now2); 

を、DateTime構造のこれらの2つのインスタンスが等しくなければなりません。しかし、conditionfalseと評価されます。どうして?

条件が真となるようにコードを変更できる方法はありますか?

+4

あなたが「あるべき」と言う、あなたはブレークポイントに入れ、インスタンスが実際に同一であることを確認したことを意味するのですか? –

+0

デバッガはあなたの友人です。 –

答えて

0

すべての答えを使用now2することになりまし複製し、正しくその問題は10.000時間がミリ秒より小さいティックであると報告が、どのように条件を変更する私に答えを与えていなかった場合それが真であると評価します。私は、コンストラクタの代わりに、

DateTime(int year, int month, ...); 

に使用する必要がありますので、アプリケーションの私のロジックの

DateTime(long ticks); 

。最初のコンストラクタではミリ秒の10.000分の1を設定することはできず、2番目のコンストラクタでは手動で計算を行わずに月の日を設定することはできません。私の解決策は、最初のコンストラクタを使用し、比較の前に1ミリ秒を追加することです:

DateTime now = DateTime.Now; 
DateTime now2 = new DateTime(now.Year, now.Month, now.Day, 
           now.Hour, now.Minute, now.Second, 
           now.Millisecond, now.Kind); 
bool condition = (now <= now2.AddMilliseconds(1)); 
1

あなたはTicksを忘れました。ここでは、条件が真である:

var now = DateTime.Now; 
var now2 = new DateTime(now.Ticks); 
var eq = now <= now2; 

編集:コメント欄での質問への答え:あなたが好きなあなたがそれらを比較することができ、この場合

var tempNow = DateTime.Now; 
var now = new DateTime(tempNow.Year ...); 
var now2 = new DateTime(tempNow.Year, tempNow.Month, customDay, ...) 

+0

私は月の日付を元の日付とは別に設定する必要があります。ロジックは、その日が今日でない限り動作しています。日時を設定し、残りのDateTimeを保持するにはどうしたらいいですか? – Uros

+0

@Uros日*が今日でない場合でも、あなたのコードは機能しません。あなたは、他のすべてのケースで1ミリ秒の時間を失っています。気づかなかっただけです。 – Servy

+0

@Urosそれはあなたが望んだものですか? –

7

It's the Ticks。それは常にティックです。時々。

DateTime now = DateTime.Now; 
DateTime now2 = new DateTime(now.Year, now.Month, now.Day, 
    now.Hour, now.Minute, now.Second, now.Millisecond); 
bool condition = (now <= now2); 

var diff = now2 - now; 

enter image description here

時間分解能はミリ秒単位よりも細かいです。 Ticks is the real value

このプロパティの値は、12:00:00午前0時から経過した100ナノ秒間隔の数を表す1月1日、0001年1月1日、0001に(0:00:00 UTCでグレゴリオ暦)、これはDateTime.MinValueを表します。

そして、それのコンストラクタがあります:

var reallyNow = new Datetime(now.Ticks); 

あなたは(それがそのためのパラメータがありませんので)now2のためにそのコンストラクタにTicksための任意の値を渡されたことがない、とそうnow2.Ticksがで4ゼロを持っています終わり。ただし、nowに直接コピーしたDateTime.Nowの値はTicksで、10,000で割り切れませんでした。

+4

私はあなたの答えの冒頭にリンクが何か陽気なmemeになると思った。どのように残念。 –

1

resolution of DateTimeは100ナノ秒であるため、1ミリ秒ではありません。ミリ秒までの値だけをコピーしました。

時間の値はthe constructor accepting "ticks"、したがって、あなたは例えば、1ミリ秒以上の精度を可能にするコンストラクタを使用する必要が

[...]、ダニと呼ばれる100ナノ秒単位で測定されています。

DateTime now = DateTime.Now; 
DateTime now2 = new DateTime(now.Ticks); 
bool condition = (now <= now2);   // yields true 
+0

ありがとうございました。今月の日を変更できますか? – Uros

+1

@Uros:もちろん、「AddDays」と数学をちょっと使ってください。 – Heinzi

0

DateTimeは、ミリ秒:ティックよりも低い解像度です。 now2を作成すると、now2.Ticksの最下位桁がゼロになります。そのためnow2は今よりも小さくなります。

私の場合: now.Ticks = 636335767998991455 now2。ダニ= 636335767998990000

あなたはDateTime now2 = new DateTime(now.Ticks)

+0

私は月の日を除くすべてを複製したいと思います。月の日は別の変数から読み込まれます。何とか設定できますか? – Uros

関連する問題