考虑到分钟,如何检查当前时间是否在特定范围内

时间:2014-09-27 19:42:23

标签: javascript jquery

我正在做餐馆送货上门的网站,取决于餐厅的送货时间我需要启用/禁用立即订购按钮

我有12小时格式的开始时间和结束时间。

这是代码

var startTime = '8:30 AM' ;
var endTime  =  '6:30 PM' ;


var formatTime = (function () {
    function addZero(num) {
        return (num >= 0 && num < 10) ? "0" + num : num + "";
    }
    return function (dt) {
        var formatted = '';

        if (dt) {
            var hours24 = dt.getHours();
            var hours = ((hours24 + 11) % 12) + 1;
            formatted = [formatted, [addZero(hours), addZero(dt.getMinutes())].join(":"),hours24>11?"pm" :"am"].join(" ");            
        }
        return formatted;
    }
})();


var currentTime = formatTime(new Date());

我需要检查当前时间是否在startTime和EndTime之间

如果它只有几小时,我可以从startTime,endTime和currentTime中提取冒号之前的第一个字符并完成这样的比较

  if(currentTime >= startTime && currentTime <= endTime) 
{
alert('Restaurant Open');
}
else
{
alert('Restaurant Closed');
}

但我也需要考虑会议记录,所以如果考虑到会议记录,你能不能让我如何做这个比较?

如何考虑当前时间是否在特定范围内,同时考虑到分钟

4 个答案:

答案 0 :(得分:8)

这样的事情应该有效

&#13;
&#13;
var startTime = '6:30 PM';
var endTime   = '8:30 AM';
var now       = new Date();

var startDate = dateObj(startTime); // get date objects
var endDate   = dateObj(endTime);

if (startDate > endDate) { // check if start comes before end
    var temp  = startDate; // if so, assume it's across midnight
    startDate = endDate;   // and swap the dates
    endDate   = temp;
}

var open = now < endDate && now > startDate ? 'open' : 'closed'; // compare
console.log('Restaurant is ' + open);

function dateObj(d) { // date parser ...
    var parts = d.split(/:|\s/),
        date  = new Date();
    if (parts.pop().toLowerCase() == 'pm') parts[0] = (+parts[0]) + 12;
    date.setHours(+parts.shift());
    date.setMinutes(+parts.shift());
    return date;
}
&#13;
.as-console-wrapper {top : 0!important}
&#13;
&#13;
&#13;

它将这些时间分开并添加12到PM时间,然后创建可以轻松比较的日期对象。

答案 1 :(得分:0)

似乎没有经过午夜的时间,尝试将时间从下午6:30改为凌晨2:30。一个好的解决方案是将momentjs与moment-range插件一起使用

function inTimeRange(time, startTime, endTime)
{
//Setup today vars
var today = new moment(new Date());
var ayear   = today.year();
var amonth  = today.month() + 1;  // 0 to 11
var adate   = today.date();
amonth  = String(amonth).length < 2 ? "0" + amonth : amonth;
adate   = String(adate).length < 2 ? "0" + adate : adate;

//Create moment objects
var moment1, moment2;
var temp = endTime.split(" ");
if(temp[1].toLowerCase() == "am")
{
    var test1 = ayear + "-" + amonth + "-" + adate + " " + startTime;
    var test2 = ayear + "-" + amonth + "-" + adate + " " + endTime;

    //Make sure that both times aren't morning times
    if(moment(test2).isAfter(test1))
    {
        var moment1String = ayear + "-" + amonth + "-" + adate + " " + startTime;
        var moment2String = ayear + "-" + amonth + "-" + adate + " " + endTime;
    }
    else
    {
        var moment1String = ayear + "-" + amonth + "-" + adate + " " + startTime;
        var moment2String = ayear + "-" + amonth + "-" + (adate + 1) + " " + endTime;
    }

    moment1 = moment(moment1String,       "YYYY-MM-DD HH:mm A");
    moment2 = moment(moment2String,       "YYYY-MM-DD HH:mm A");
}
else 
{
    var moment1String = ayear + "-" + amonth + "-" + adate + " " + startTime;
    var moment2String = ayear + "-" + amonth + "-" + adate + " " + endTime;
    moment1 = moment(moment1String,       "YYYY-MM-DD HH:mm A");
    moment2 = moment(moment2String,       "YYYY-MM-DD HH:mm A");
}

//Run check
var start = moment1.toDate();
var end   = moment2.toDate();

var when;
if(String(time).toLowerCase() == "now")
{
    when = moment(new Date());
}
else
{
    var timeMoment1String = ayear + "-" + amonth + "-" + adate + " " + time;
    when = moment(timeMoment1String);
}

var range = moment().range(start, end);
return when.within(range);
}

答案 2 :(得分:0)

var startTime = '02:30 AM';
var endTime   = '13:00 PM';



var now       = new Date();
var startDate = dateObj(startTime);
var endDate   = dateObj(endTime);

alert(endDate)

var open = now < endDate && now > startDate ? 'open' : 'closed';
alert('Restaurant is ' + open);

function dateObj(d) {
    var parts = d.split(/:|\s/),
        date  = new Date();
    if (parts.pop().toLowerCase() == 'pm') parts[0] = (+parts[0]) + 12;
    date.setHours(+parts.shift());
    date.setMinutes(+parts.shift());
    return date;
}

var startTime = '8:30 AM';
var endTime   = '6:30 PM';

var now       = new Date();
var startDate = dateObj(startTime);
var endDate   = dateObj(endTime);

var open = now < endDate && now > startDate ? 'open' : 'closed';
alert('Restaurant is ' + open);

function dateObj(d) {
    var parts = d.split(/:|\s/),
        date  = new Date();
    if (parts.pop().toLowerCase() == 'pm') parts[0] = (+parts[0]) + 12;
    date.setHours(+parts.shift());
    date.setMinutes(+parts.shift());
    return date;
}

答案 3 :(得分:0)

我做了类似的事情。我的应用正在接收军事时间。因此,如果时间没到第二天(即开始时间09:00和结束时间17:00),您只需检查一下您是否在这些时间之间即可。

如果结束时间是午夜之后(即开始时间15:00和结束时间01:00),则有以下三种情况:

  1. 您处于开始时间和结束时间之后的某个时间(例如16:00),在这种情况下,您处于工作时间内
  2. 您处于开始时间和结束时间之前的某个时间,例如00:30,在这种情况下,您也在工作时间内。
  3. 您在结束时间之后但在开始时间之前的某个时间(例如02:30),在这种情况下,您不在工作时间之外

这是我的代码示例:

const isCurrentDayPart = (dayPart) => {

  let currentTime = moment();
  let startTime = moment(dayPart.startTime, "HH:mm");
  let endTime = moment(dayPart.endTime, "HH:mm");

  if (dayPart.startTime < dayPart.endTime) {
    return currentTime.isBetween(startTime, endTime);
  } else {
    if (currentTime.isAfter(endTime) && currentTime.isAfter(startTime)) {
      return true;
    } else if (currentTime.isBefore(endTime) && currentTime.isBefore(startTime)) {
      return true;
    }
  }
  return false;
};