【问题标题】:Javasript check current datetime with loop 2 between datetimesJavascript在日期时间之间使用循环2检查当前日期时间
【发布时间】:2025-12-08 01:15:01
【问题描述】:

我正在处理时间循环。

var startShow = [];
var endShow = [];

for(var i = 0; i < jsonStr[4].length; i < i++)
{
    startShow[i] = moment(jsonStr[4][i].start_show).format('MM/DD/YYYY HH:mm:ss');
    //ex: 01/12/2021 18:32:40,01/12/2021 17:32:40,01/12/2021 16:52:40,01/12/2021 18:10:40
    endShow[i] = moment(jsonStr[4][i].end_show).format('MM/DD/YYYY HH:mm:ss');
    //ex: 01/12/2021 18:53:55,01/12/2021 18:23:40,01/12/2021 19:32:40,01/12/2021 19:50:40
}

现在我有了这个 FlipClock 插件,

var theCounters = $('.clock .value').FlipClock({
    clockFace: 'TwentyFourHourClock',
    callbacks:
    {
        interval:function()
        {
            var time = this.factory.getTime().time;
                            
            var currentTime = (moment(time).format('MM/DD/YYYY HH:mm:ss'));
                            
            //Here I need the currentTime check if there is a time between startShow and endShow matched.
            if(matched)
            {
                alert("matched");
            }
            else
            {
                alert("not matched");
            }
        }
    }
});

我的问题,是否可以检查 startShow 和 endShow 之间的 currentTime 是否与我上面的代码匹配?

【问题讨论】:

    标签: javascript flipclock


    【解决方案1】:

    不是startShowendShow 的两个数组,而是将一个数组作为showTime 并添加具有startShowendShow 值的对象。也不要格式化时间,因为它会将值转换为字符串。而是将其保留为时刻对象。

    类似地,在 interval: function() 内部得到 currentTimevar currentTime = moment(moment(new Date()).format('MM/DD/YYYY ') + time);。现在您的条件将类似于showTime.some(s =&gt; s.startShow &lt;= currentTime &amp;&amp; s.endShow &gt;= currentTime),如果currentTime 介于任何showTime 数组中的任何startShowendShow 之间,它将返回true。

    var showTime = [];
    
    for (var i = 0; i < jsonStr[4].length; i < i++) {
      showTime.push({
        startShow: moment(jsonStr[4][i].start_show),
        endShow: moment(jsonStr[4][i].end_show),
        title: moment(jsonStr[4][i].title)
      });
    }
    
    var theCounters = $('.clock .value').FlipClock({
      clockFace: 'TwentyFourHourClock',
      callbacks: {
        interval: function() {
          var time = this.factory.getTime().time;
          var currentTime = moment(moment(new Date()).format('MM/DD/YYYY ') + time);
    
          //Here I need the currentTime check if there is a time between startShow and endShow matched.
          // Loop over each show time
          showTime.forEach(s => {
            // Check condition for whether current time falls between any show time
            // and alert status with show title
            if (s.startShow <= currentTime && s.endShow >= currentTime) {
              alert("matched - " + s.title);
            } else {
              alert("not matched - " + s.title);
            }
          });
        }
      }
    });
    

    在下面试试。

    var showTime = [];
    // adding dateString for testing only. You should use date from your response
    var dateString = moment(new Date()).format('MM/DD/YYYY ');
    
    // add start, end time & title into object to be pushed into array
    showTime.push({
      startShow: moment(dateString + '18:32:40'),
      endShow: moment(dateString + '18:53:55'),
      title: "abc"
    });
    showTime.push({
      startShow: moment(dateString + '17:32:40'),
      endShow: moment(dateString + '18:23:55'),
      title: "def"
    });
    
    var time = '18:20:00';
    var currentTime = moment(moment(new Date()).format('MM/DD/YYYY ') + time);
    
    // Loop over each show time
    showTime.forEach(s => {
      // Check condition for whether current time falls between any show time
      // and alert status with show title
      if (s.startShow <= currentTime && s.endShow >= currentTime) {
        alert("matched - " + s.title);
      } else {
        alert("not matched - " + s.title);
      }
    });
    
    //if (showTime.some(s => s.startShow <= currentTime && s.endShow >= currentTime)) {
    //  alert("matched");
    //} else {
    //  alert("not matched");
    //}
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.0/moment.min.js" integrity="sha512-lMkd3Y03vWd6SXDKGLaPgbco+3VNI4xtwiuADZvr29hzHhxIdonDcZQF0k/eAf6/1vI4b2eNqkkIm42Hjxiz6A==" crossorigin="anonymous"&gt;&lt;/script&gt;

    【讨论】:

    • 它总是返回我不匹配,在我的例子中:如果当前日期时间现在:19:20:00,我们还有 2 个日期时间显示,01/12/2021 19:32:40,01/ 12/2021 19:50:40
    • 我已更新 currentTime 对象以获取日期。并更新了if 内的条件。创建了 sn-p,因此您现在也可以进行测试。
    • 嗨,我试过你的更新代码并且工作正常。但为什么它只提醒我 1 次?正如我们所知,它应该提醒 2 次,对吗?如果每个 showTime.push 内部有 ex: title: "abc"title: "def",如何获取值
    • 虽然showTime 有两个值,但如果至少有一个条件匹配,showTime.some(...) 将返回true。我们也只使用了一次if,它不在循环内,所以警报只显示一次。
    • 可以用循环制作吗?以及关于我之前关于abcdef 的问题的任何线索?