[Node.js] 列出一整年中,特定星期幾的日期
我自己有維護一個各圖書館的休館日清單,
好讓我的圖書館多重帳戶登入 app 可以顯示最近的休館日~
今天突然發現,原來央圖分館每週一是固定休館,
而這些固定休館日就不會寫在他們的休館日列表上,
這樣我就沒辦法簡單的複製他們的列表,直接貼到我的列表上…
當然另一個解決的方法是修改 app,讓它自己去算是不是週一,
但這樣就等於是在休館日清單這個邏輯上,多弄了個 hard-code 的東西,不太喜歡,
想想還是自己寫個小程式,輸入年份和星期幾,
就自動列出該年度相對應的日期就行了~
程式最主要的部分如下:
for (var day = 1;; day++) { // Construct Date object dayObj = new Date(year, 0, day); // If exceed specified year, exit loop if (dayObj.getFullYear() !== year) { break; } if (dayObj.getDay() === weekday) { console.log(jsAppendToLen(dayObj.getFullYear(), 4, "0") + "/" + jsAppendToLen(dayObj.getMonth()+1, 2, "0") + "/" + jsAppendToLen(dayObj.getDate(), 2, "0")); } }
這個程式的邏輯是從年度的 1/1 開始,每次加一天,
看看這一天是不是指定的星期幾,是的話就顯示出來~
這邊遇到的一個困難是,要如何將一個日期加 1 天呢?
試了一下,Date 物件的 constructor 可以接受一個 (年, 月, 日) 的參數,
而這邊的日是可以超過 31 的!例如 32 就會自動算成 2/1~
知道了這個的話,其實就讓一個整數從 1 開始累加,持續建立一個 (年,0, 日) 的 Date 物件,
就相當於年度的每一天囉~
完整的程式如下 (這裡面跟 node.js 有關的只有取得 CLI 參數,和用 path 取得檔名的部分 :P):
var path = require("path"); function jsAppendToLen(sValue, nLen, sAppendChar, bAppendToLeft) { sValue = "" + sValue; while (sValue.length < nLen) { sValue = (bAppendToLeft !== false ? sAppendChar + sValue : sValue + sAppendChar); } return sValue; } // Get command line parameters if (process.argv.length < 4) { console.log("Usage: " + path.basename(process.argv[0]) + " " + path.basename(process.argv[1]) + " <year> <weekday (0~6)>"); process.exit(); } var year = Number(process.argv[2]); var weekday = Number(process.argv[3]); var dayObj; for (var day = 1;; day++) { // Construct Date object dayObj = new Date(year, 0, day); // If exceed specified year, exit loop if (dayObj.getFullYear() !== year) { break; } if (dayObj.getDay() === weekday) { console.log(jsAppendToLen(dayObj.getFullYear(), 4, "0") + "/" + jsAppendToLen(dayObj.getMonth()+1, 2, "0") + "/" + jsAppendToLen(dayObj.getDate(), 2, "0")); } }
執行的結果就像下面這樣囉:
testuser@localhost ~ $ node list_days_of_weekday.js Usage: node list_days_of_weekday.js <year> <weekday (0~6)> testuser@localhost ~ $ node list_days_of_weekday.js 2016 1 2016/01/04 2016/01/11 2016/01/18 2016/01/25 ...... ...... 2016/12/12 2016/12/19 2016/12/26
(本頁面已被瀏覽過 127 次)