【问题标题】:midnight closed - working hours午夜关闭 - 工作时间
【发布时间】:2018-07-29 15:56:24
【问题描述】:

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

示例:周一营业时间低于开市和闭市时间。一旦用户在晚上 00:05(12:05 AM)访问(当商店营业时),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 }

【问题讨论】:

  • 在 javascript 或任何编程语言中处理时间都很复杂。您的代码存在语法错误,因为您在数字中添加了一些 : 符号,但您不能只将时间和日期视为数字。有人可能会给你一个很好的答案,但同时我建议阅读Date 对象并习惯它作为一种新的数据类型,它不是字符串或数字
  • @Timofey 关于语法没问题,我也可以使用对象。我只想解决逻辑游戏。

标签: javascript time


【解决方案1】:

如果您不是指定结束时间而是像这样指定它的开放小时数,该怎么办:

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 问题。

主要思想是根据当天的营业时间加上数组中指定的额外时间(以小时为单位)来计算商店访问量。如果不允许使用 3rd 方库,请原谅我,但出于时间考虑,我利用了时刻等。

代码如下:

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>

【讨论】:

  • 我喜欢这个,只是一个简单的问题,如果商店有休息时间样本:11am - 12 (12pm-3pm break) then 3pm - 5pm ?
  • 好吧,我们将问题分解为持续时间问题...中断会引入更多持续时间,您必须检查 now 是否在其中。就这里的原则而言,没有什么不同。跨度>
【解决方案2】:

我建议将营业时间存储起来稍有不同。而不是你有什么尝试以下:

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

【讨论】:

  • forEach 不会循环周二
【解决方案3】:

只是一个想法.. 试试这个。 创建一个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 及其 tuesday 并且您获得的是 tuesday 数据而不是 monday 数据并检查时间,您可以通过转到数组中的前一个索引来仔细检查 tuesday 是否仍应打开。基本上,您可以在该 JSON 对象中放入任何内容来帮助您确认。

【讨论】:

  • 没有“JSON 对象”这样的东西。 JSON 是字符串格式。
  • 首字母缩略词 JSON 本身指的是 JavaScript Object Notation。我打赌你没有点击链接到 JSON 一词的链接。
  • 我没有,但我现在已经这样做了。该页面与您的答案一样令人困惑。
  • 只需删除“JSON”的所有实例。一个对象只是……一个对象。另外,您真的认为按名称比较工作日有用吗?
  • 是的。在回答这里之前已经尝试和测试过。你想看完整的sn-p吗?
【解决方案4】:

问题是

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

如果您有一个数组,其中包含每天 天的营业时间,且没有任何午夜交叉点,则可以轻松进行比较并查看任何特定日期和时间是否开放或关闭:

现在 >= day[1] && now =

【讨论】:

  • 问题是您比较了错误的数据。您星期一凌晨 3 点的项目不是星期一。真的是星期二。您需要将当前日期/时间与实际一天时间进行比较。周一凌晨 3 点实际上是周日晚上的一部分,而不是周二..
【解决方案5】:

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

您也可以只保存打开时间作为开始时间。例如上午 11 点,另一个数字是 4。这意味着它从 11 点开始营业 4 小时。这样,当您从打开开始计算日期和时间时,它会给您一个结果,以确定它是打开还是关闭

【讨论】:

    【解决方案6】:

    我决定在前一天检查一下。

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

    【讨论】:

      猜你喜欢
      • 2023-02-26
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 2016-01-13
      相关资源
      最近更新 更多