代码之家  ›  专栏  ›  技术社区  ›  7urkm3n Neeraj Kumar

午夜关闭-工作时间

  •  0
  • 7urkm3n Neeraj Kumar  · 技术社区  · 7 年前

    我正在努力解决一家商店的工作时间,问题是他们的关门时间是第二天晚上或午夜。

    示例:星期一时间低于“打开”和“关闭”。一旦用户在晚上00:05(12:05)访问(商店开放时), n 这一天已经是星期二了,商店的演出也结束了。

    我怎么才能正确地知道,现在是星期一,商店营业时间到了?

    var d = new Date();
    var n = d.getDay();
    var now = d.getHours() + ":" + d.getMinutes();
    var weekdays = [
        ["Sunday", 11:00, 24:00], //  11am - 12 AM    next day
        ["Monday", 10:00, 03:00], //  10am - 3 AM     next day
        ["Tuesday", 10:00, 23:59], // 10am - 11:59pm same day
        ["Wednesday"] // Closed!
    ];
    var day = weekdays[n];
    
    
    if (now > day[1] && now < day[2]) {
        //Currently Open!
    }else{ //closed }
    
    6 回复  |  直到 7 年前
        1
  •  1
  •   Akrion    7 年前

    如果您不指定结束时间,而是指定打开的小时数,该怎么办:

    var weekdays = [
        ["Sunday", '11:00:00', 11], //  11am - 12 AM  next day
        ["Monday", '10:00:00', 7], //  10am - 3 AM  next day
        ["Tuesday", '10:00:00', 2], // 10am - 11:59pm same day
        ["Wednesday"] // Closed!
    ];
    

    如果这个小时格式不完美,那么只需使用Moment(使用您的旧格式)来获取持续时间(这是结束时间减去开始时间的差),然后按照下面我所做的相同方式添加。应该以同样的方式工作。底线是让这个 duration 问题。

    主要思想是根据当前一天的开放时间加上数组中指定的额外时间(以小时为单位)来计算存储访问。现在请原谅我,如果不允许第三方libs,但为了我利用时间等。

    下面是代码:

    var now = moment(new Date());
    var weekdays = [
      ["Sunday", '11:00:00', 11], // 11am - 12 AM  next day
      ["Monday", '10:00:00', 7], // 10am - 3 AM  next day
      ["Tuesday", '10:00:00', 2], // 10am - 11:59pm same day
      ["Wednesday"] // Closed!
    ];
    var day = weekdays[now.day()];
    
    if (day.length > 1) {
      var timePieces = day[1].split(':');
      // then set the actual hour/min/sec of today which would be the startDate now
      var startOfToday = moment(now).hour(timePieces[0]).minutes(timePieces[1]).seconds(timePieces[2]);
      // the actual end would be the start date plus the hours
      var actualEnd = moment(startOfToday).add(day[2], 'hours');
    
      if (now > startOfToday && now < actualEnd) {
        console.log('YOU SHALL PASS!');
      } else {
        console.log('NONE SHALL PASS!');
      }
    } else {
      // Closed the entire day scenario
      console.log('NONE SHALL PASS!');
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        2
  •  1
  •   7urkm3n Neeraj Kumar    7 年前

    我建议把营业时间稍微改一下。请尝试以下方法,而不是您所拥有的:

    var weekdays = [
        ["Sunday", [11:00, 23:59] ], //  11am - 11:59 PM    same day
        ["Monday", [10:00, 23:59] ], //  10am - 11:59 PM     same day
        ["Tuesday", [[00:00, 03:00], [10:00, 23:59] ], //12am - 3am AND 10am - 11:59pm same day
        ["Wednesday"] // Closed!
    ];
    

    这样,您的开放时间将与实际工作日匹配,而不会与第二天重叠。 所以,如果我们看一下你的例子,客户在00:05访问商店,他实际上是在周二访问商店。( Date.now().getDay() 应该实际返回2,即周二)。

      function isOpen(currentTime, weekdays){
            var day = currentTime.getDay();
            var hours = weekdays[day];
            hours.forEach(h => {
                if (now >= h[1] && now <= h[2]) {
                  return true;
                }
            });
            return false;
       }
    
        3
  •  0
  •   TimeTrax murali selenium    7 年前

    只是一个想法…试试这个。 创建一个 JSON 对象。

    var Monday = {
    "openDay":"Monday",
    "openTime":"10:00am",
    "closeTime":"2:30am",
    "closeday":"Tuesday",
    "sameDayclose":false
    

    }//对所有工作日重复

    var weekdays =[Monday, Tuesday, Wednesday];// put json objects in the array
    

    得到 now (当前日期和时间) 所以,从日期和时间,提取你需要的…例如,我每天和每小时提取

    //assuming you now have a day (now.day) and an hour (now.hour) stored somewhere
    //Tuesday, 1am => (closeday (Monday.closeday) && closeTime (Monday.closetime) )
    
    some interesting conditions
    If now.day<Monday.closeday => open // not yet tuesday so no need to check time. 
    If now.day == Monday.closeday && now.hour < Monday.closetime => open
    if now.day == Monday.closeday && now.hour > Monday.closetime && now.hour < Tuesday.opentime => closed
    

    这样,如果您获取星期二和星期二的数据,而不是星期一的数据,那么您可以检查时间,方法是转到数组中的上一个索引,查看星期二是否仍应打开。基本上,您可以在JSON对象中放置任何内容来帮助您确认。

        4
  •  0
  •   Terry Carmen    7 年前

    问题是

    “[”Monday“,10:00,03:00]实际上是 星期一10:00->23:59:59,然后是 星期二00:00->03:00。

    一旦有一个数组包含 每一个 一天没有任何午夜交叉口,很容易进行比较,并查看特定的一天和一天时间是开放的还是封闭的:

    now>=第[1]天&now=第[2]天&day=第[0]天

        5
  •  0
  •   TimeTrax murali selenium    7 年前

    另外,如果你的目标只是告诉你它是打开的还是关闭的。在数组中,可以保存关闭的时间

    您也只能将打开的时间保存为开始时间。例如上午11点,另一个数字是4。也就是说从11点开始营业4小时。这样,当您从“打开”开始计算日期和时间时,它将给出一个结果,该结果将决定它是“打开”还是“关闭”。

        6
  •  0
  •   7urkm3n Neeraj Kumar    7 年前

    我决定前一天检查一下。

    days = [
        {
            "day": "Sunday",
            "hours": [["11:00", "23:00"]],
            "overNight": false
        },
        {
            "day": "Monday",
            "hours": [ ["09:00", "12:00"], ["14:00", "01:00"] ],
            "overNight": true
        },
        {
            "day": "Tuesday",
            "hours": [["11:00", "23:00"]],
            "overNight": false
        }
    }
    
    
    function isOpen(d, days){
        var day  = d.getDay();
        var now  = d.getHours() + ":" + d.getMinutes();
        var bool = false;
    
        actualyDay = days[day];
        hours    = actualyDay.hours;
        for (var i = 0; i < hours.length; i++) {
            if ((now >= hours[i][0]) && (now <= hours[i][1])) {
                bool= true
            }
        }
    
        if (!bool) {
            var prevDay = day-1;
            prevDay = days[prevDay < 0 ? 7+(prevDay) : prevDay];
            hours = prevDay.hours;
            if (prevDay.overNight && (now <= hours[hours.length-1][1])) {
                bool = true
            }
        }
        return bool;
    }
    
    d = new Date(); //pass anyday, time...
    console.log(isOpen(d, days))