国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

            手機(jī)站
            千鋒教育

            千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

            千鋒教育

            掃一掃進(jìn)入千鋒手機(jī)站

            領(lǐng)取全套視頻
            千鋒教育

            關(guān)注千鋒學(xué)習(xí)站小程序
            隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

            當(dāng)前位置:首頁  >  技術(shù)干貨  > Cron表達(dá)式解析器詳解

            Cron表達(dá)式解析器詳解

            來源:千鋒教育
            發(fā)布人:xqq
            時(shí)間: 2023-11-22 08:41:33 1700613693

            一、Cron表達(dá)式生成器

            Cron表達(dá)式是一種在定時(shí)任務(wù)中經(jīng)常使用的語法,它可以用來指定被執(zhí)行的時(shí)間,像“每小時(shí)執(zhí)行一次”或“每周星期五晚上10點(diǎn)執(zhí)行”等等。由于Cron表達(dá)式的語法比較復(fù)雜,因此通常需要使用Cron表達(dá)式生成器來幫助用戶快速生成想要的表達(dá)式。

            下面是一個(gè)簡單的Cron表達(dá)式生成器的示例,它可以讓用戶選擇任務(wù)執(zhí)行的時(shí)間單位、時(shí)間點(diǎn)和重復(fù)頻率,然后根據(jù)用戶的選擇生成對應(yīng)的Cron表達(dá)式:

            
            function generateCronExpression() {
              // 獲取用戶的選擇
              let timeUnit = document.getElementById("time-unit-select").value;
              let timePoint = document.getElementById("time-point-input").value;
              let repeatFrequency = document.getElementById("repeat-frequency-input").value;
              
              // 根據(jù)用戶選擇生成Cron表達(dá)式
              let cronExp = "";
              if (timeUnit === "hourly") {
                cronExp = 0 ${timePoint} 0/${repeatFrequency} * * *;
              } else if (timeUnit === "daily") {
                cronExp = 0 ${timePoint} * * * *;
              } else if (timeUnit === "weekly") {
                cronExp = 0 ${timePoint} * * ${repeatFrequency} *;
              } else if (timeUnit === "monthly") {
                cronExp = 0 ${timePoint} ${repeatFrequency} * * *;
              }
              
              document.getElementById("result").innerHTML = cronExp;
            }
            

            二、Cron表達(dá)式解析成時(shí)間

            除了生成Cron表達(dá)式之外,我們還需要將Cron表達(dá)式解析成對應(yīng)的時(shí)間點(diǎn),以便于查看任務(wù)執(zhí)行的計(jì)劃。下面是一個(gè)簡單的解析器,它可以將Cron表達(dá)式解析成下一次執(zhí)行的時(shí)間點(diǎn):

            
            function getNextExecutionTime(cronExp) {
              let cronArr = cronExp.split(" ");
              let now = Date.now();
              
              // 解析分鐘表達(dá)式
              let minuteExp = cronArr[0];
              let nextMinute = getNextValidValue(minuteExp, new Date(now).getMinutes());
              
              // 解析小時(shí)表達(dá)式
              let hourExp = cronArr[1];
              let nextHour = getNextValidValue(hourExp, new Date(now).getHours());
              
              // 解析日表達(dá)式
              let dayExp = cronArr[2];
              let nextDay = getNextValidValue(dayExp, new Date(now).getDate());
              
              // 解析月表達(dá)式
              let monthExp = cronArr[3];
              let nextMonth = getNextValidValue(monthExp, new Date(now).getMonth() + 1);
              
              // 解析星期表達(dá)式
              let weekExp = cronArr[4];
              let nextWeekDay = getNextValidValue(weekExp, new Date(now).getDay());
              
              // 解析年表達(dá)式
              let yearExp = cronArr[5];
              let nextYear = getNextValidValue(yearExp, new Date(now).getFullYear());
              
              // 計(jì)算下一次執(zhí)行的時(shí)間點(diǎn)(注意要考慮到月份和年份的變化)
              let nextDate = new Date(nextYear, nextMonth - 1, nextDay, nextHour, nextMinute);
              while (nextDate.getTime() < now) {
                nextMonth++;
                if (nextMonth > 12) {
                  nextMonth = 1;
                  nextYear++;
                }
                nextDate.setFullYear(nextYear, nextMonth - 1, nextDay);
              }
              
              return nextDate;
            }
            
            function getNextValidValue(exp, currentValue) {
              // TODO:根據(jù)表達(dá)式解析出下一個(gè)合法的值
              // 略去具體實(shí)現(xiàn)
              return 0;
            }
            

            三、Cron表達(dá)式在線解析

            為了方便用戶查詢指定Cron表達(dá)式的下一次執(zhí)行時(shí)間點(diǎn),我們可以提供一個(gè)在線的解析工具,用戶只需要將表達(dá)式粘貼到輸入框中,即可得到下一次的執(zhí)行時(shí)間:

            
            function parseCronExpression() {
              let cronExp = document.getElementById("cron-exp-input").value;
              let nextExecutionTime = getNextExecutionTime(cronExp);
              document.getElementById("next-execution-time").innerHTML = nextExecutionTime;
            }
            

            四、Cron表達(dá)式每5分鐘

            有時(shí)候我們需要將任務(wù)設(shè)置成每5分鐘一次執(zhí)行,這時(shí)候就需要使用*/5來指定:

            
            0 */5 * * * *
            

            五、Cron表達(dá)式解析

            對于Cron表達(dá)式的解析,其實(shí)就是將表達(dá)式的各個(gè)部分解析出來,并根據(jù)這些部分計(jì)算下一次的執(zhí)行時(shí)間點(diǎn)。下面是一個(gè)完整的Cron表達(dá)式解析器的實(shí)現(xiàn),它可以解析所有Cron表達(dá)式,并計(jì)算出下一次的執(zhí)行時(shí)間點(diǎn):

            
            function parseCronExpression(cronExp) {
              let cronArr = cronExp.split(" ");
              let now = Date.now();
              
              // 解析分鐘表達(dá)式
              let minuteExp = cronArr[0];
              let nextMinute = getNextValidValues(minuteExp, new Date(now).getMinutes());
              
              // 解析小時(shí)表達(dá)式
              let hourExp = cronArr[1];
              let nextHour = getNextValidValues(hourExp, new Date(now).getHours());
              
              // 解析日表達(dá)式
              let dayExp = cronArr[2];
              let nextDay = getNextValidValues(dayExp, new Date(now).getDate());
              
              // 解析月表達(dá)式
              let monthExp = cronArr[3];
              let nextMonth = getNextValidValues(monthExp, new Date(now).getMonth() + 1);
              
              // 解析星期表達(dá)式
              let weekExp = cronArr[4];
              let nextWeekDay = getNextValidValues(weekExp, new Date(now).getDay());
              
              // 解析年表達(dá)式
              let yearExp = cronArr[5];
              let nextYear = getNextValidValues(yearExp, new Date(now).getFullYear());
              
              let nextExecutionTimes = [];
              
              for (let i = 0; i < nextMinute.length; i++) {
                for (let j = 0; j < nextHour.length; j++) {
                  for (let k = 0; k < nextDay.length; k++) {
                    for (let l = 0; l < nextMonth.length; l++) {
                      let date = new Date(nextYear[0], nextMonth[l] - 1, nextDay[k], nextHour[j], nextMinute[i]);
                      while (date.getTime() < now) {
                        // 如果時(shí)間已經(jīng)過去了,則需要加上一個(gè)周期
                        if (monthExp === "*" && weekExp === "*") {
                          // 每天執(zhí)行的任務(wù)
                          date.setDate(date.getDate() + 1);
                        } else if (monthExp === "*" && weekExp !== "*") {
                          // 每周某一天執(zhí)行的任務(wù)
                          date.setDate(date.getDate() + 7);
                        } else if (monthExp !== "*" && weekExp === "*") {
                          // 每月某一天執(zhí)行的任務(wù)
                          let tempDate = new Date(date.getFullYear(), date.getMonth() + 1, 0);
                          date.setDate(tempDate.getDate() + 1);
                          if (date.getMonth() + 1 !== nextMonth[l]) {
                            // 某個(gè)月沒有對應(yīng)日期,需要調(diào)整到下一個(gè)合法日期
                            date.setDate(1);
                            date.setMonth(date.getMonth() + 1);
                          }
                        } else {
                          // 每年某一天執(zhí)行的任務(wù)
                          let tempDate = new Date(date.getFullYear(), nextMonth[l], 0);
                          date.setDate(tempDate.getDate() + 1);
                          if (date.getMonth() + 1 !== nextMonth[l] || date.getDay() !== nextWeekDay[0]) {
                            // 某個(gè)月沒有對應(yīng)的星期,或者對應(yīng)的星期不是指定的星期,需要調(diào)整到下一個(gè)合法日期
                            date.setDate(1);
                            date.setMonth(date.getMonth() + 1);
                            while (date.getDay() !== nextWeekDay[0]) {
                              date.setDate(date.getDate() + 1);
                            }
                          }
                        }
                      }
                      
                      nextExecutionTimes.push(date);
                    }
                  }
                }
              }
              
              return nextExecutionTimes;
            }
            
            function getNextValidValues(exp, currentValue) {
              let result = [];
              if (exp === "*") {
                // 如果表達(dá)式為*,則返回對應(yīng)取值范圍內(nèi)的所有值
                for (let i = getMinValue(exp); i <= getMaxValue(exp); i++) {
                  result.push(i);
                }
              } else if (exp.indexOf("/") !== -1) {
                // 如果表達(dá)式中包含/,則按照步長來獲取合法值
                let arr = exp.split("/");
                let startValue = getMinValue(arr[0]);
                let step = parseInt(arr[1]);
                for (let i = startValue; i <= getMaxValue(exp); i += step) {
                  result.push(i);
                }
              } else if (exp.indexOf(",") !== -1) {
                // 如果表達(dá)式中包含,,則將其拆分成多個(gè)子表達(dá)式
                let arr = exp.split(",");
                for (let i = 0; i < arr.length; i++) {
                  result = result.concat(getNextValidValues(arr[i], currentValue));
                }
                result = Array.from(new Set(result)); // 去重
                result.sort(function(a, b) { return a - b; }); // 排序
              } else if (exp.indexOf("-") !== -1) {
                // 如果表達(dá)式中包含-,則按照范圍來獲取合法值
                let arr = exp.split("-");
                let minValue = parseInt(arr[0]);
                let maxValue = parseInt(arr[1]);
                for (let i = minValue; i <= maxValue; i++) {
                  result.push(i);
                }
              } else {
                // 如果表達(dá)式為單個(gè)數(shù)值,則直接返回該值
                result.push(parseInt(exp));
              }
              
              // 對于星期表達(dá)式,還需要特殊處理,因?yàn)樾瞧诘娜≈捣秶?~6,但是Date對象中的星期是從0開始的
              // 因此需要將所有星期的值+1,如果越界了則取模
              if (exp.startsWith("0") && result.indexOf(7) !== -1) {
                result.push(0);
              } else if (exp.startsWith("7") && result.indexOf(0) !== -1) {
                result.push(7);
              }
              result = result.map(function(value) { return (value === 7 ? 0 : value + 1); });
              for (let i = 0; i < result.length; i++) {
                result[i] %= 7;
              }
              
              // 如果當(dāng)前值不在合法值的范圍內(nèi),需要找到比它大的第一個(gè)合法值
              let index = result.indexOf(currentValue);
              if (index === -1) {
                for (let i = 0; i < result.length; i++) {
                  if (result[i] > currentValue) {
                    index = i;
                    break;
                  }
                }
              }
              
              // 如果當(dāng)前值在合法值的范圍內(nèi),直接從它開始向后找到下一個(gè)合法值
              if (index !== -1) {
                for (let i = index; i < result.length; i++) {
                  if (result[i] >= currentValue) {
                    result = result.slice(i);
                    break;
                  }
                }
              }
              
              // 如果找不到合法值,說明下一次執(zhí)行時(shí)間已經(jīng)超過了指定的時(shí)間范圍,這時(shí)候需要將結(jié)果清空
              if (result.length === 0) {
                result.push(getMinValue(exp));
              }
              
              return result;
            }
            
            function getMinValue(exp) {
              // TODO:根據(jù)表達(dá)式獲取取值范圍的最小值
              // 略去具體實(shí)現(xiàn)
              return 0;
            }
            
            function getMaxValue(exp) {
              // TODO:根據(jù)表達(dá)式獲取取值范圍的最大值
              // 略去具體實(shí)現(xiàn)
              return 59;
            }
            

            六、Cron表達(dá)式在線生成器

            除了簡單的Cron表達(dá)式生成器之外,我們還可以提供一個(gè)功能更加強(qiáng)大的在線生成器,讓用戶可以通過界面來選擇更加復(fù)雜的任務(wù)執(zhí)行計(jì)劃:

            
            // 界面部分
            // 略...
            
            // 事件處理部分
            function generateCronExpression() {
              let minuteExp = getCronExp("minute");
              let hourExp = getCronExp("hour");
              let dayExp = getCronExp("day");
              let monthExp = getCronExp("month");
              let weekExp = getCronExp("week");
              
              let            
            聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
            10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
            請您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
            免費(fèi)領(lǐng)取
            今日已有369人領(lǐng)取成功
            劉同學(xué) 138****2860 剛剛成功領(lǐng)取
            王同學(xué) 131****2015 剛剛成功領(lǐng)取
            張同學(xué) 133****4652 剛剛成功領(lǐng)取
            李同學(xué) 135****8607 剛剛成功領(lǐng)取
            楊同學(xué) 132****5667 剛剛成功領(lǐng)取
            岳同學(xué) 134****6652 剛剛成功領(lǐng)取
            梁同學(xué) 157****2950 剛剛成功領(lǐng)取
            劉同學(xué) 189****1015 剛剛成功領(lǐng)取
            張同學(xué) 155****4678 剛剛成功領(lǐng)取
            鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
            董同學(xué) 138****2867 剛剛成功領(lǐng)取
            周同學(xué) 136****3602 剛剛成功領(lǐng)取
            相關(guān)推薦HOT
            sort函數(shù)頭文件用法介紹

            一、sort函數(shù)頭文件概述sort函數(shù)頭文件是C++STL中的一個(gè)頭文件,包含了一系列的排序函數(shù)。sort函數(shù)是對一個(gè)指定區(qū)間內(nèi)的元素進(jìn)行排序的函數(shù),通...詳情>>

            2023-11-22 11:01:57
            Grafana中文界面詳解

            一、Grafana中文界面簡介Grafana是一個(gè)可視化的開源數(shù)據(jù)分析和監(jiān)控工具,其圖形化界面可以幫助用戶更好地展現(xiàn)、分析數(shù)據(jù),并針對數(shù)據(jù)建立儀表盤...詳情>>

            2023-11-22 10:40:21
            Direct.h的全面介紹

            一、direct.h路徑direct.h是Windows下一個(gè)C/C++語言頭文件,所以在使用前需要引入該頭文件。在Visual Studio中,點(diǎn)擊“項(xiàng)目”-“屬性”-“C/C++...詳情>>

            2023-11-22 10:25:57
            Bat腳本中文亂碼問題詳解

            一、含中文路徑引起的亂碼問題1、問題描述在編寫bat腳本時(shí),如果路徑中包含中文,那么在執(zhí)行bat腳本時(shí)就會出現(xiàn)亂碼問題,導(dǎo)致腳本無法正常執(zhí)行...詳情>>

            2023-11-22 10:15:09
            BAT腳本隱藏運(yùn)行窗口詳解

            一、BAT腳本的基本概念BAT腳本是Windows平臺下的批處理文件,通常以.bat為擴(kuò)展名。它是由DOS命令組合而成的,可以自動(dòng)運(yùn)行一系列的命令,是一種...詳情>>

            2023-11-22 09:57:09