2017-06-20 100 views
1

考慮以下(簡化的)代碼:這兩個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); 

自從我複製的now下地now2,所述DateTime結構的這兩個實例應該相等。然而,condition評估爲false。爲什麼?

是否有某種方法可以更改代碼以使條件評估爲true?

+4

當你說「應該是」,你的意思是你把一個斷點,並證實情況實際上是相同的? –

+0

調試器是你的朋友。 –

回答

0

全部回答正確的報道,問題是是10.000倍,比毫秒小蜱,但沒有給我一個答案如何更改條件所以它的評估爲真。我需要使用構造

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

代替:

DateTime(long ticks); 

,因爲我的應用程序邏輯。事實證明,使用第一個構造函數不可能設置第10.000th毫秒的部分,並且使用第二個構造函數不可能在沒有手動計算某些算術的情況下設置月份中的某一天。我的解決方案是使用第一個構造函數和之前相比增加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

你忘了蜱蟲。這裏條件爲真:

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即使當天*不是*今天,您的代碼也無法正常工作。在所有這些其他情況下,你失去了幾毫秒的時間,你只是沒有注意到。 – Servy

+0

@Uros是你想要的嗎? –

7

It's the Ticks。它總是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

此屬性的值表示在0001年1月1,0001年1月1,(UTC 0:00:00 12:00:00以來午夜以來經過的100納秒爲間隔的數量,在公曆),代表DateTime.MinValue。

而且還有爲它的構造函數:

var reallyNow = new Datetime(now.Ticks); 

你從來沒有通過任何價值Ticks成構造爲now2(因爲它有沒有參數),所以now2.Ticks將在四個零結束。但是,直接複製到nowDateTime.Now確實有一個Ticks值,該值不能被10,000整除。

+4

我認爲你的答案開始時的鏈接是某種熱鬧的模因。多麼令人失望。 –

1

因爲resolution of DateTime是100納秒,而不是1毫秒。您只能將值複製到毫秒。

時間值在稱爲100納秒爲單位測得的蜱,[...]

因此,就需要使用一個構造,其允許更高的精度比1毫秒,例如,the constructor accepting "ticks"

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

謝謝你。現在我可以更改month of month2嗎? – Uros

+1

@Uros:當然,只需使用AddDays和一些數學運算。 – Heinzi

0

的DateTime具有比毫秒較低的分辨率:蜱。當您創建now2時,now2中的最低有效數字.Ticks爲零,這就是now2比現在更小的原因。

對我來說: now.Ticks = 636335767998991455 now2。蜱= 636335767998990000

如果要立即複製到now2使用DateTime now2 = new DateTime(now.Ticks)

+0

我想複製除月中某天以外的所有內容。從另一個變量讀取月中的某天。我可以設置它嗎? – Uros

相關問題