繁体   English   中英

C#将小时限制为分钟

[英]C# limit the hour with minute

我只想在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,但应采用此值

提前致谢

我建议您按一天中的实际时间(以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类型,因为它表示您真正感兴趣的内容。

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

虽然使用实际的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)给出的答案基本相同,我在提交后才看到。

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

我必须承认我不了解实际问题。 但是,您也可以使用更易于阅读的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属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM