亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 JavaScript 中計算不包括周末和聯邦假期的前一個工作日

在 JavaScript 中計算不包括周末和聯邦假期的前一個工作日

嚕嚕噠 2022-01-01 20:29:49
我正在編寫一個函數,它將為我提供任何給定日期的前一個工作日。工作日意味著它是工作日,并且當天沒有聯邦假期。我的解決方案在今天(案例 1)是“2019-06-20T07:00:00.000Z”時有效;即星期四 // 返回星期三此外,當今天(情況 2)為“2019-06-24T07:00:00.000Z”時有效,即星期一 // 返回星期五但是當今天(情況 3)是 2019-05-28T07:00:00.000Z // 星期二時失敗。對于情況 3,它應該返回前一個工作日為 5 月 24 日(星期五),因為星期一(5 月 27 日)是假期。對于案例 3,它返回 5 月 27 日,星期一。下面是我的代碼,在我的 or 語句中我正在檢查前一天,但它沒有考慮到這一點,
查看完整描述

2 回答

?
青春有我

TA貢獻1784條經驗 獲得超8個贊

您沒有充分發揮 Luxon 的潛力。您應該將日期保留為 Luxon 對象,使用 Luxon 的方法對其進行所有操作,然后將日期轉換為字符串。


為此,我定義了一個輔助函數prevBusinessDayHelper,該函數采用 Luxon 日期時間并返回表示前一個工作日的日期時間。它完全按照 Luxon 日期時間運行,這很容易。然后在外部函數中,我在 Luxon 日期時間之間進行轉換。


const DateTime = luxon.DateTime;


// use a Set to make lookups cheaper

const federalHolidays = new Set([

  '2019-05-27', // <-- you were missing the 0 here in yours

  '2019-09-02',

  // snip

]);


// recursion is good here because it's very shallow

const prevBusinessDayHelper = dt => {


  // use luxon's tools!

  const yest = dt.minus({ days: 1 });


  if (yest.weekday == 6 || yest.weekday == 7 || federalHolidays.has(yest.toISODate()))

    return prevBusinessDayHelper(yest);


  return yest;

};


const prevBusinessDay = (isoString, zone) => {

  const dt = DateTime.fromISO(isoString).setZone(zone);

  return prevBusinessDayHelper(dt).toISODate();

};


console.log(prevBusinessDay("2019-05-28T07:00:00.000Z", "America/New_York"));

<script src="https://cdn.jsdelivr.net/npm/[email protected]/build/global/luxon.min.js"></script>


查看完整回答
反對 回復 2022-01-01
?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

當您檢查假期數組時,您正在檢查完整日期而不是日期部分。


function check_previous_business_date(date, timezone) {

      const startDate = new Date(luxon.DateTime.fromISO(date).setZone(timezone));

      const todayTimeStamp = +new Date(startDate); // Unix timestamp in milliseconds

      const oneDayTimeStamp = 1000 * 60 * 60 * 24; // Milliseconds in a day

      const diff = todayTimeStamp - oneDayTimeStamp;

      const yesterdayDate = new Date(diff);

      const yesterdayString = yesterdayDate.getFullYear()

         + '-' + (yesterdayDate.getMonth() + 1) + '-' + yesterdayDate.getDate();

      for (startDate.setDate(startDate.getDate() - 1);

        !startDate.getDay() || startDate.getDay() === 6 ||

        federalHolidays.includes(startDate.toISOString().split('T')[0]) ||

        federalHolidays.includes(yesterdayString);

        startDate.setDate(startDate.getDate() - 1)

      ) { 

      }


      return startDate.toISOString().split('T')[0];

    }

const federalHolidays= [

  '2019-05-27',

  '2019-09-02',

  '2019-10-14',

  '2019-11-11'

];

console.log('Prev. day of 2019-05-28 is ',check_previous_business_date('2019-05-28T07:00:00.000Z', 'America/New_York'));

console.log('Prev. day of 2019-06-20 is ',check_previous_business_date('2019-06-20T07:00:00.000Z', 'America/New_York'));

<script src="https://cdn.jsdelivr.net/npm/[email protected]/build/global/luxon.min.js"></script>


查看完整回答
反對 回復 2022-01-01
  • 2 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號