我想仅在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但它应该取这个值
提前致谢
答案 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
属性。