[Node.js] 列出一整年中,特定星期幾的日期

[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

 

(本頁面已被瀏覽過 107 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料