午夜关闭-工作时间

时间:2018-07-29 15:56:25

标签: javascript time

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

示例:星期一的营业时间低于开放和关闭的时间。用户在晚上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 个答案:

答案 0 :(得分:1)

我建议存储开放时间稍有不同。代替您尝试的方法:

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;
   }

答案 1 :(得分:1)

如果您不是结束时间而是指定营业时间的小时数,怎么办?

import * as React from 'react';
import * as ReactDOM from 'react-dom';
import {SortableContainer, SortableElement, arrayMove} from 'react-sortable-hoc';

const SortableItem = SortableElement(({value}) =>
  <li>{value}</li>
);

const SortableList = SortableContainer(({items}) => {
  return (
    <ul>
      {items.map((value, index) => (
        <SortableItem key={`item-${index}`} index={index} value={value} />
      ))}
    </ul>
  );
});

class SortableComponent extends React.Component {
  state = {
    items: ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', 'Item 6'],
  };
  onSortEnd = ({oldIndex, newIndex}) => {
    this.setState({
      items: arrayMove(this.state.items, oldIndex, newIndex),
    });
  };
  render() {
    return <SortableList items={this.state.items} onSortEnd={this.onSortEnd} />;
  }
}

ReactDOM.render(<SortableComponent/>, document.getElementById('root'));

如果该小时格式不完美,则只需使用一下矩(使用您的旧格式)来获取持续时间(这将是结束时间减去开始时间的差),然后以与我完全相同的方式添加吼叫。应该以相同的方式工作。最重要的是使这成为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! ]; 问题。

主要思想是根据当天的开放时间加上数组中指定的额外时间(以小时为单位)来计算商店访问量。现在请原谅我是否不允许第三方聚会,但是为了节省时间,我利用了片刻等。

下面是代码:

duration
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!');
}

答案 2 :(得分:0)

问题是

  

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

一旦您有了一个包含每天且没有任何午夜穿越时间的开放时间的数组,就可以轻松进行比较,并查看是否有特定的日期和时间是通过以下方式打开或关闭的:

  

现在> =天[1] &&现在= <天[2] &&天==天[0]

答案 3 :(得分:0)

一个想法..尝试一下。 创建一个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

这样,如果获取getDay及其星期二,并且获取星期二数据而不是星期一数据并检查时间,则可以通过转到数组中的上一个索引来进行仔细检查,以查看星期二是否仍应打开。基本上,您可以在JSON对象中放入任何内容以帮助您确认。

答案 4 :(得分:0)

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

您也只能将其打开的时间保存为开始时间。例如,上午11点,另一个数字为4,这意味着它从11开始开放4个小时。这样,当您计算打开日期和时间时,它将为您提供确定打开还是关闭状态的结果

答案 5 :(得分:0)

我决定检查前一天。

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))