1

我只想在 12:30 -- 14:00 和 18:00 -- 21:00 之间启用该复选框。

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 但它应该采用这个值

提前致谢

4

3 回答 3

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 TimeLocalTime中的类型,因为它代表了您真正感兴趣的内容。

您还应该记住,上面的代码使用服务器上的本地时间- 如果您的用户位于不同的时区,可以吗?

于 2013-09-24T07:36:49.800 回答
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);

更新:这与 Jon Skeet 给出的答案基本相同,我在提交后才看到。

另外,请注意时间在进步。根据您的要求,您可能需要设置一个计时器来更改复选框的状态。

于 2013-09-24T07:47:19.067 回答
0

我必须承认我不了解实际问题。但是,您也可以使用TimeSpan可能更具可读性的 a:

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总是设置属性。

于 2013-09-24T07:39:22.937 回答