Home > Enterprise >  javascript condition always running incorrect if statement
javascript condition always running incorrect if statement

Time:04-14

I have some JS and my issue is that it now just returns a time out. Please see my code below

I am not sure where I went wrong with this?

exports.handler = function(context, event, callback) {
    // With timezone:
    // In Functions/Configure, add NPM name: moment-timezone, version: 0.5.14
    // Timezone function reference: https://momentjs.com/timezone/
    let moment = require('moment-timezone');
    //
    // timezone needed for Daylight Saving Time adjustment
    let timezone = event.timezone || 'America/New_York';
    console.log("  timezone: "   timezone);
    //
const schedule = new Map([
  [ 0, {open: [00,00], close: [00,00]} ],
  [ 1, {open: [08,30], close: [17,00]} ],
  [ 2, {open: [08,30], close: [17,00]} ],
  [ 3, {open: [08,30], close: [17,00]} ],
  [ 4, {open: [08,30], close: [17,00]} ],
  [ 5, {open: [08,30], close: [17,00]} ],
  [ 6, {open: [00,00], close: [00,00]} ],
])

function isOpen(weekday, hour, minute) {
  const {open, close} = schedule.get(weekday)
  // opening hour
  if (hour == open[0])
    return minute >= open[1]
  // closing hour
  if (hour == close[0])
    return minute < close[1]
  // any minute of any open hour
  return hour > open[0] && hour < close[0]
}
};

CodePudding user response:

.format returns a String and you are comparing the results to Numbers. Relying on type coercion can be the source of many hard-to-find bugs. I would suggest use of .hour(), .minute(), etc, which returns a Number. Read Get/Set Docs for more info.

Another thing I would recommend is reference a single moment -

const m = moment().tz(timezone)
const hour = m.hour()
const minute = m.minute()
// ...

Repeated calls to moment().tz(...) is a code smell and can actually cause bugs if your time code depends on millisecond values.

You also (probably) have a bug with your condition -

hour >= 08 && minutes > 30 && hour < 17
hour minute status
8 29 closed
8 30 closed
8 31 open
8 59 open
9 00 closed
9 20 closed
9 30 closed
9 31 open
... 20 closed
... 30 closed
... 31 open
... 59 open
... 00 closed

You may also consider a schedule and an isOpen function. The function takes the current weekday, and the current hour and minute. This approach also allows you to have different hours on different days, without making the isOpen function more complicated -

const schedule = new Map([
  [ 0, {open: [00,00], close: [00,00]} ],
  [ 1, {open: [08,30], close: [17,00]} ],
  [ 2, {open: [08,30], close: [17,00]} ],
  [ 3, {open: [08,30], close: [17,00]} ],
  [ 4, {open: [08,30], close: [17,00]} ],
  [ 5, {open: [08,30], close: [17,00]} ],
  [ 6, {open: [00,00], close: [00,00]} ],
])

function isOpen(weekday, hour, minute) {
  const {open, close} = schedule.get(weekday)
  // opening hour
  if (hour == open[0])
    return minute >= open[1]
  // closing hour
  if (hour == close[0])
    return minute < close[1]
  // any minute of any open hour
  return hour > open[0] && hour < close[0]
}

console.log("Sun @ 08:30", isOpen(0, 08, 30))
console.log("Mon @ 08:00", isOpen(1, 08, 00))
console.log("Mon @ 08:30", isOpen(1, 08, 30))
console.log("Mon @ 09:00", isOpen(1, 09, 00))
console.log("Mon @ 16:59", isOpen(1, 16, 59))
console.log("Mon @ 17:00", isOpen(1, 17, 00))
console.log("Tue @ 12:00", isOpen(2, 12, 00))
console.log("Wed @ 04:00", isOpen(3, 04, 00))
console.log("Thu @ 14:00", isOpen(4, 14, 00))
console.log("Fri @ 15:45", isOpen(5, 15, 45))
console.log("Sat @ 12:00", isOpen(6, 12, 00))
.as-console-wrapper {min-height: 100% !important; top: 0}

Sun @ 08:30 false
Mon @ 08:00 false
Mon @ 08:30 true
Mon @ 09:00 true
Mon @ 16:59 true
Mon @ 17:00 false
Tue @ 12:00 true
Wed @ 04:00 false
Thu @ 14:00 true
Fri @ 15:45 true
Sat @ 12:00 false

CodePudding user response:

The problem is that you check for the minutes to be always greater than 30. Thus 9:40 is open but 9:20 is closed

Try this

if (( ((hour>=8 && minutes>=30)|| (hour >= 9)) && hour < 17) && (dayOfWeek >= 1 && dayOfWeek <= 5)) {
    // "open" from 8:30am to 5pm, EST.
    response = "open";
} else {
    response = "closed";
}
theResponse = response   " : "   hour   " "   dayOfWeek;
console.log("  Time request: "   theResponse);
  • Related