【问题标题】:Using moment.js, JS, or Jquery, turn on a feature within a time frame使用 moment.js、JS 或 Jquery,在时间范围内打开功能
【发布时间】:2015-11-01 13:18:44
【问题描述】:

我正在尝试编写能够在特定时间之间可靠地显示 div 的代码。

我正在使用 moment.js,他们在文档中声称他们可以帮助做到这一点,但我找不到查询我需要的时间的正确方法。

我的代码可以让您了解我想要什么,但它并没有真正起作用,因为当我尝试打开或关闭该功能时,如果时间在午夜之前,我最终会得到负数而不是时间。 (我使用 UTC 时间并减去 10 小时。我可以在我的数组中使用负数,但为了清楚起见,我想尽可能坚持实际时间。)

另外,我的代码现在的方式是,我可以一次关闭该功能,但在一段时间后关闭它会更好,在两次之间打开它会是最好的。

你们知道如何正确查询 moment().isAfter 或 .isBetween 时间而不是日期吗?

到目前为止,我已经尝试了多种排列方式:

moment().isBetween('7:00:00', '8:00:00', 'hour', 'minute'); and .isAfter.

文档似乎没有这方面的示例,并且过去没有人在网络上提出过这个问题。谢谢!

var openSun = [6,7,17,22]; // on hours

// Sundays ---------------------------------------------- //
// setup sunday - on
if (moment().days() === 7) {
    for (var i = 0; i < openSun.length; i++) {
        if (openSun[i] === moment().utc().hours()-10) {
            $('#cast').hide();
            $('#cast-on').show();
        } 
    }
}

// switch back to off
var offhoursSun = [8,17,22];
var offminutesSun = [00,30,30];

for (var j = 0; j < offhoursSun.length; j++) {

    if ((moment.utc().hours()-10 === offhoursSun[j]) && (moment.utc().minutes() === offminutesSun[j])) {
      $('#cast').show();
      $('#cast-on').hide();
    }
}

【问题讨论】:

    标签: javascript jquery time momentjs


    【解决方案1】:

    对于这样的任务,您可以使用 vanilla javascript 来解决它。

    首先,我建议使用更好、更通用的数据结构来存储您的时间段。我更喜欢这样:

    var openSun = [
        {
            start: {
                hour: 7,
                minute: 0,
            },
            end: {
                hour: 8,
                minute: 0,
            },
        },
        {
            start: {
                hour: 17,
                minute: 0,
            },
            end: {
                hour: 17,
                minute: 30,
            },
        },
        {
            start: {
                hour: 22,
                minute: 0,
            },
            end: {
                hour: 22,
                minute: 30,
            },
        }
    ];
    

    然后你可以通过定义的时间段来检查你是否真的在一个边界之间:

    $(function(){
        var start, end, now;
        var d = new Date();
    
        now = d.getHours()*60+d.getMinutes();
        $('#cast').show();
        $('#cast-on').hide();
    
    
    
        if (d.getDay() === 0) {
            for (var slot = 0, len = openSun.length; slot < len; slot++) {
                start = openSun[slot].start.hour*60+openSun[slot].start.minute;
                end = openSun[slot].end.hour*60+openSun[slot].end.minute;
                if (now>start && now<end){
                    $('#cast').hide();
                    $('#cast-on').show();
                    break;
                }
            }
        }
    
    });
    

    请随时查看http://jsfiddle.net/yLy8ocd5/的代码

    我使用了您的数据。要使示例正常工作,只需将其更改为适合某个时间段。

    编辑:这就是它与 moment.js 的工作方式:

    $(function(){
        var start, end;
    
        $('#cast').show();
        $('#cast-on').hide();   
    
    
        if (moment().weekday() === 0) {
            for (var slot = 0, len = openSun.length; slot < len; slot++) {
                start = moment({
                    hour: openSun[slot].start.hour, 
                    minute: openSun[slot].start.minute
                });
    
                end = moment({
                    hour: openSun[slot].end.hour, 
                    minute: openSun[slot].end.minute
                });
    
                if (moment().isBetween(start, end)){
                    $('#cast').hide();
                    $('#cast-on').show();
                    break;
                }
            }
        }
    
    });
    

    【讨论】:

    • 啊,我明白你在这里做了什么。我也喜欢您将小时数乘以 60 的方式,因此我们不必处理时间转换。我尝试先走香草路线,但我不知道如何处理时间。顺便说一句,出于好奇,我仍然想要一个 moment.js 的答案,但你的答案绝对是一个答案。我会在它打开一段时间后标记它,谢谢!
    • @nyhunter:我使用 moment.js 添加了一个包含相同解决方案的 sn-p。但是如果你不应该有更复杂的日期/时间来解决任务或任何类型的日期/时间值的本地化,我不明白为什么你应该更喜欢使用库而不是简单的 vanilla js。
    • 谢谢,我最初提出这个问题是因为我认为使用moment.js,我的代码可以压缩为一行或两行,我也必须在工作日和周六这样做。我现在知道我可以将这些时间和日期添加到变量对象中,而忘记使用数组。干净多了。但是,我希望得到 3 行类似于: if (current time) isBetween(open, close){turn on}, 就可以了...很好地简化了我的代码。我想它仍然无法做到这一点?再次感谢!
    • 你可以省略开始和结束变量,并将它们的定义放入 isBetween 检查和 $('#cast').show();一开始基本上是多余的。您将节省大约 10 行代码,但它的可读性要高得多。
    【解决方案2】:

    您是否尝试将新的日期 JavaScript 传递给介于和之后的 momentjs?我看到您在日期值中使用字符串

    【讨论】:

    • 你的意思是我在哪里有时间作为查询中的字符串?他们网站上的例子是 moment('2010-10-20').isBetween('2010-10-19', '2010-10-25'); // 真的。但是他们说如果没有输入日期,它将默认为第一个的当前时间,并且查询可以用于时间和日期。我想我只是使用不正确。我不需要日期,因为这个事件会在每个星期天发生,我会照顾到 - 我必须在后者中添加 (moment().days() === 7) 。 (对不起这里的格式,我不知道如何编辑我的答案,所以它看起来格式很好)
    • 抱歉,StackOverflow 不允许我再次编辑,这是我想引用的示例: moment('2010-10-20').isBetween('2010-01-01', ' 2012-01-01', '年份');.
    猜你喜欢
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多