2013-09-24 75 views
1

我想在12:30 - 14:00和18:00 - 21:00之間啓用複選框。C#用分鐘限制小時數

if (((DateTime.Now.Hour >= 12 || DateTime.Now.Minute >= 30) && DateTime.Now.Hour < 14) || (DateTime.Now.Hour >= 18 && DateTime.Now.Hour < 21)) 
     { ASPxCheckBox_ForceClot.Enabled = true; } 

問題分鐘,12:30

DateTime.Now.Hour >= 12 || DateTime.Now.Minute >= 30 

它拒絕12:45,但它應該把這個值

DateTime.Now.Hour >= 12 && DateTime.Now.Minute >= 30 

它拒絕13:12,但它應該藉此值

在此先感謝

+0

你想問什麼?有什麼問題,請詳細解釋 –

回答

2

雖然使用實際的DateTime或TimeSpan對象的建議很好,但真正的問題是您的布爾邏輯有缺陷。

你應該寫類似

var now = DateTime.Now.TimeOfDay; 

bool enabled = 
    now >= new TimeSpan(12, 30, 0) && now < new TimeSpan(14, 0, 0) || 
    now >= new TimeSpan(18, 0, 0) && now < new TimeSpan(21, 0, 0); 

UPDATE:這是基本相同的答案被喬恩斯基特,我只提交後看到了給定的。

另外,請注意時間的推移。根據您的要求,您可能需要設置一個計時器,以便在需要時更改複選框的狀態。

+1

我個人會使用括號來使'&&'和'||'的優先級更清晰。即使它是正確的(我不記得手),如果它是明確的,那麼*讀者*就會更清楚。 –

+1

@JonSkeet讀者往往更清楚,我經常自己做。但通常不是像這樣的情況,計算是連接的分離,每個連接都按照自己的路線行進。而且,在我所知道的所有語言中,連接優先於析取,就像它在數學中一樣。順便說一句,這類似於乘法與加法的優先級。實際上,在代數中,連接是布爾乘法('&& true'不會改變結果;'&& false'會使一切都爲假),並且分離是布爾加法('|| false'不會改變結果)。 –

+0

即使在這種情況下,我也會這樣做 - 顯然,編譯器並不在乎它全部在一行;它確實取決於語言規則,我寧願在此明確表示,而不是記住規則。您認爲使用明確的包圍曝光可以減少清晰度嗎? –

4

我建議你白天(表示爲TimeSpan值)的實際時間做到這一點,而不是:

var firstPeriodStart = new TimeSpan(12, 30, 0); 
var firstPeriodEnd = new TimeSpan(14, 0, 0); 

var secondPeriodStart = new TimeSpan(18, 0, 0); 
var secondPeriodEnd = new TimeSpan(21, 0, 0); 

DateTime time = DateTime.Now.TimeOfDay; 

if ((time >= firstPeriodStart && time < firstPeriodEnd) || 
    (time >= secondPeriodStart && time < secondPeriodEnd)) 
{ 
    ASPxCheckBox_ForceClot.Enabled = true; 
} 

更重要的是(IMO)在Noda Time使用LocalTime型爲代表你真正感興趣

您還應該記住,上面的代碼使用服務器上的本地時間 - 如果您的用戶處於不同的時區,那麼可以嗎?

+0

你再次擊敗我!通過Skeet先生,有一天我會打出你的樣子! – Gusdor

+0

在日期時間對象中缺少第二部分.... –

+0

@LolCoder:該死了,以爲這只是小時和分鐘就可以。將改爲TimeSpan版本。 –

0

我必須承認,我不明白實際的問題。但是,你也可以使用一個TimeSpan這可能是更具可讀性:

var ts1Start = TimeSpan.FromHours(12) + TimeSpan.FromMinutes(30); 
var ts1End = TimeSpan.FromHours(14); 
var ts2Start = TimeSpan.FromHours(18); 
var ts2End = TimeSpan.FromHours(21); 
var now = DateTime.Now.TimeOfDay; 
ASPxCheckBox_ForceClot.Enabled = (now >= ts1Start && now < ts1End) 
           || (now >= ts2Start && now < ts2End); 

一說我的代碼可以解決可能出現的問題是,您使用的是if沒有else。所以複選框在啓用後永遠不會被禁用。上面的代碼總是設置Enabled屬性。