如何返回下一个可用日期

时间:2018-09-27 02:24:45

标签: javascript node.js

我正在用Express构建一个项目,并且有一个计划日历。我想在第二天提供给我的用户。格式为YYYY-MM-DD。

规则:

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

我也有一系列公共假期,这些假期也不可用。如果第二天是公众假期,则该应用应在第二天返回。

有个公共假期,我的应用程序进入一个循环,并运行整个循环。我不知道该如何解决。我以为它第二次运行时会跳过循环。

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

2 个答案:

答案 0 :(得分:1)

我认为这种逻辑将起作用-我创建了一个函数来处理“日期字符串-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()

您可能还有更多工作可以简化代码-但这至少可以解决问题

答案 1 :(得分:0)

我认为您应该在下一天始终加1。因此,如果今天是公众假期,请尝试第二天。重复该循环,直到不是公众假期。

if (publicHolidays.includes(available)) {
    availableDay(nextDay +1 );
} else {
    console.log('returning available', available);
    return(available);
}