javascript - 如何返回下一个可用日期

标签 javascript node.js

我正在使用 Express 构建一个项目,并且有一个日程安排日历。我想在下一个可用日提供给我的用户。格式 YYYY-MM-DD。

规则:

下一个可用日期通常是明天,除非:
- 下午 4 点后,下一个可用日期是从现在起的两天后(即周一下午,他们可以在周三预订);
- 周五下午 4 点后,下一个可用日是周一;
- 星期六是星期一;
- 周日是周二;

我还有一系列公共(public)假期,但也无法使用。如果第二天是公共(public)假期,应用程序应在后一天返回。

当有公共(public)假期时,我的应用程序会进入循环并运行整个循环。我不知道如何解决这个问题。我以为第二次运行时会跳过循环。

const publicHolidays = ['2018-09-28', '2018-12-25']

const availableDay = (nextDay) => {
  const d = new Date();
  const utc = d.getTime() + (d.getTimezoneOffset() * 60000);
  const nd = new Date(utc + (3600000 * 8));

  if (nextDay === undefined) {
    nextDay = 1;
  }
  if (nd.getDay() === 5 && nd.getHours() > 15) {
    nextDay = 3;
  } else if ([0, 6].includes(nd.getDay()) || nd.getHours() > 15) {
    nextDay = 2;
  }
  const day = new Date();
  const tomorrow = new Date(day);
  tomorrow.setDate(tomorrow.getDate() + nextDay);
  const yy = tomorrow.getFullYear();
  let mm = tomorrow.getMonth() + 1;
  if (mm < 10) {
    mm = `0${mm}`;
  }
  let dd = tomorrow.getDate();
  if (dd < 10) {
    dd = `0${dd}`;
  }
  const available = `${yy}-${mm}-${dd}`;
  if (publicHolidays.includes(available)) {
    const nextDay = 7;
    for (let i = 2; i < nextDay; i += 1) {
      availableDay(i);
    }
  } else {
    console.log('returning available', available);
    return(available);
  }
}

availableDay()

最佳答案

我认为这个逻辑会起作用 - 我创建了一个函数来执行“日期字符串 - yyyy-mm-dd”事情,因为它现在在两个地方使用

我还通过 tomorrow.getDay() % 6 === 0 检查周末 - 你当然可以使用 [0, 6].includes(tomorrow.getDay()) 如果你愿意的话

const publicHolidays = ['2018-09-28', '2018-12-25']

const availableDay = () => {
    let nextDay = 1; // since we are not recursive any more
    const d = new Date();
    const utc = d.getTime() + (d.getTimezoneOffset() * 60000);
    const nd = new Date(utc + (3600000 * 8));

    if (nd.getDay() === 5 && nd.getHours() > 15) {
        nextDay = 3;
    } else if ([0, 6].includes(nd.getDay()) || nd.getHours() > 15) {
        nextDay = 2;
    }
    const day = new Date();
    const tomorrow = new Date(day);
    tomorrow.setDate(tomorrow.getDate() + nextDay);
    // changes start here
    const dateString = d => `${.getFullYear()}-${('0' + (d.getMonth() + 1)).toString(-2)}-${('0' + d.getDate()).toString(-2)}`;

    let available = dateString(tomorrow);
    while (publicHolidays.includes(available) || (tomorrow.getDay() === 0)) {
        tomorrow.setDate(tomorrow.getDate() + 1);
        available = dateString(tomorrow);
    }
    console.log('returning available', available);
    return(available);
}

availableDay()

您可能可以采取更多措施来简化代码 - 但这至少应该可以解决问题

关于javascript - 如何返回下一个可用日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52528503/

相关文章:

javascript - 如何捕获 iframe 中下载的文件?

javascript - 如何在不破坏我的网页的情况下向我的 div 添加滚动条

javascript - 我如何在网站上制作 discord.js 机器人统计信息?

写入 csv 文件时的 Node.js 同步

javascript - jade 中无法解释的 "<"和双输出包括

javascript - 正则表达式字边界在 '-' 处中断

javascript - webkit 输入类型=日期 在错误的日期发送空值

javascript - 用vue计算数字

javascript - 使用后退按钮和 "sortable"表单问题恢复表单状态(Chrome 和 safari 但不是 Firefox)

javascript - 在 node.js 中,如何以最轻量级的方式检查给定的一串代码在语法上是否正确?