0

我目前有以下脚本:

<script>
if(new Date().getHours() > 17 || (new Date().getHours() == 17 &&     
new Date().getMinutes()== 0 && new Date().getSeconds() == 0) && 
(new Date().getHours() < 21 && new Date().getMinutes() < 30 
&& new Date().getSeconds() == 0)){
        //do nothing.   
    } else {
    $(document).ready(function() {
        $(".inline").colorbox({inline:true, open:true, width:"50%"});
        });
    }

所以基本上 if 中的内容:如果时间是 17:00 到 21:30,则什么也不做,否则显示该框。但是发生了什么事,盒子在 18:00 左右停止工作,并在午夜再次开始工作。有人看到这里有什么问题吗?

4

4 回答 4

1
$(document).ready(function()
{
    var now = new Date(),
        block = $('div');

    if(now.getHours() >= 17 && (now.getHours() < 21 || (now.getHours() == 21 && now.getMinutes() <= 30)))
    {
        block.text('17:00 - 21:30');
        //do nothing.    
    }
    else
    {
        block.text('not 17:00 - 21:30');
        //$(".inline").colorbox({inline:true, open:true, width:"50%"});
    }
}); 

演示:http: //jsfiddle.net/FwtRb/10/

于 2012-09-23T12:26:39.010 回答
1

请注意,日期(包括小时)中的许多字段都是 0 索引的。这就是为什么您在 18:00 左右观察到此停止工作的原因。

我建议使用变量来使条件更易于推理。尝试这样的事情。如果您担心命名空间污染,请在其周围设置一个闭包。

var now = new Date();
var startQuietPeriod = new Date();
startQuietPeriod.setHours(16); startQuietPeriod.setMinutes(0); startQuietPeriod.setSeconds(0); startQuietPeriod.setMilliseconds(0);  // Today at 17:00
var endQuietPeriod = new Date();
endQuietPeriod.setHours(20); endQuietPeriod.setMinutes(30); endQuietPeriod.setSeconds(0); endQuietPeriod.setMilliseconds(0);  // Today at 21:30
if (startQuietPeriod < now && now < endQuietPeriod) {
  // don't show prompt
} else {
  // show prompt
}
于 2012-09-23T12:30:32.423 回答
1

我是这样写的:

var now = new Date();

if (now.getHours() >= 17 && now.getHours() <= 21) {
    if (now.getHours() == 21 && now.getMinutes() > 30) {
        return;
    }
}

// Do your document.ready stuff here

首先,我确实将当前时间保存到一个变量中,这样我就可以少输入(记住:做一个懒惰的打字员!)。此外,这也稍微清理了您的条件,因此更容易发现任何逻辑错误。

其次,我将您的条件(在 17:00 和 21:30 之间什么都不做)分成两个单独的 if 条件。就个人而言,我更喜欢这种方式,因为它很简单,即使你在 2 年后回到你的代码。
您的代码与可读性一样好。永远记住这一点。复杂的 if 条件,即使评论很好,也只会让你和其他人在未来变得困难。忽略那些称你为菜鸟的人。

此外,我发现使用 a 更具可读性, 如果条件匹配return,它只会中止当前函数/ 。<script>这可以为您节省 1 个缩进级别 :-)

Update: You should also read peakxu's answer (and therefore the MDN page for Date). Note that, as peakxu said, all of this is 0 indexed.

于 2012-09-23T12:47:06.200 回答
0
var d = new Date();

if ( d.getHours() < 17 || 
     d.getHours() > 21 ||
    (d.getHours() == 21 && d.getMinutes() >= 30)) {

        $(document).ready(function() {
            $(".inline").colorbox({inline:true, open:true, width:"50%"});
        });
}
于 2012-09-23T12:24:11.953 回答