2015-04-03 130 views
2

我有一個布爾告訴我,如果當前時間是在兩個其他時間之間它將在晚上8(20:00)黑暗和早晨7點亮..我我不確定我是否應該做7或07我曾試過展位,但仍然是假的?C#時間布爾總是返回false

誰能告訴我爲什麼這總是返回false?沒有什麼其他的說真的只是當它目前在兩次之間時它總是返回false .. GTM Timezone倫敦,謝謝!

public static bool NightTime 
{ 
    get 
    { 
     TimeSpan span = LastMoodlightUpdate - DateTime.Now; 
     TimeSpan start = new TimeSpan(20, 0, 0); //Dark at 20:00 
     TimeSpan end = new TimeSpan(07, 0, 0); //Light at 07:00 
     TimeSpan now = DateTime.Now.TimeOfDay; 
     return ((now > start) && (now < end)); 
    } 
} 
+8

如何能同時大於20和小於7? – 2015-04-03 21:19:14

+0

在他們之間的展位..晚上8點,早上7點..這很容易發生 – user4746801 2015-04-03 21:19:56

+1

你比較TimeSpans而不是日期。這是奇特的。 – adv12 2015-04-03 21:19:57

回答

7

這裏的問題是比較兩個TimeSpan值是一個簡單的數字比較。

因此,就價值而言,任何時間都不能大於20:00並且小於07:00。我們人類可以處理這種不協調,但計算機不能。

你需要考慮你想要什麼位置:

|---------|..................................|-----------| 
00  07         20   24 

你想在劃線的時候,基本上你應該使用||而不是&&

return (now > start) || (now < end); 

由於一天的時間不能消極的,也不能達到24:00或更高,這會給你你想要的。

+0

這使得破解的代碼工作(並贏得了我的upvote),但從概念上來說,使用類型實現其預期目的仍然會更好。 TimeSpan只是這個工作的錯誤結構。 – adv12 2015-04-03 21:35:51

+0

.NET框架中沒有內置正確的類型來處理時間。考慮到'TimeOfDay'屬性返回'TimeSpan',我說他做的都對。我們都希望框架中有單獨的'Date'和'Time'類型,但是沒有。 – 2015-04-03 21:37:04

1

我沒有得到你所有代碼的目的。這不是很簡單嗎?

public static bool NightTime 
{ 
    get 
    { 
     var hour = System.DateTime.Now.Hour; 
     return (hour <=7 || hour >= 20); 
    } 
}