C#用分钟限制小时

时间:2013-09-24 07:33:30

标签: c# asp.net datetime

我想仅在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但它应该取这个值

提前致谢

3 个答案:

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

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

答案 1 :(得分: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给出的答案基本相同,我在提交后才看到。

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

答案 2 :(得分: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属性。