訂判斷及所需輸入
題內要求2027 二月及三月每月三十一日。跳過規則二月沒有輪次,三月才三十一;月底路徑卻建二月二十八。兩種本地規則都可訂,這裏只收已明選那種。
| 情況 | 輸入 JSON |
|---|---|
| 原例測試 | {"year":2027,"months":[2,3],"day":31,"rule":"skip"} |
跑所附比較
程序用 UTC 公曆月長展開題內規則,不解析外部重複格式,也不推供應商預設。
| 路徑 | 輸出 JSON |
|---|---|
| 錯誤路徑 | {"dates":["2027-02-28","2027-03-31"]} |
| 所需路徑 | {"dates":[null,"2027-03-31"]} |
import assert from 'node:assert/strict';
const run=function run(i,corrected=true){
if(!['skip','last-day'].includes(i.rule)||!Number.isInteger(i.year)||i.year<100||i.year>9999||!Number.isInteger(i.day)||i.day<1||i.day>31||!i.months.every(m=>Number.isInteger(m)&&m>=1&&m<=12))return {held:true};
const dates=i.months.map(month=>{const last=new Date(Date.UTC(i.year,month,0)).getUTCDate();const day=corrected&&i.rule==='skip'&&i.day>last?null:Math.min(i.day,last);return day===null?null:i.year+'-'+String(month).padStart(2,'0')+'-'+String(day).padStart(2,'0');});
return {dates};
};
const cases=[{"input":{"year":2027,"months":[2,3],"day":31,"rule":"skip"},"corrected":false,"expected":{"dates":["2027-02-28","2027-03-31"]}},{"input":{"year":2027,"months":[2,3],"day":31,"rule":"skip"},"corrected":true,"expected":{"dates":[null,"2027-03-31"]}},{"input":{"year":2028,"months":[2],"day":31,"rule":"last-day"},"corrected":true,"expected":{"dates":["2028-02-29"]}},{"input":{"year":2027,"months":[1],"day":31,"rule":"skip"},"corrected":true,"expected":{"dates":["2027-01-31"]}},{"input":{"year":2027,"months":[2],"day":31,"rule":null},"corrected":true,"expected":{"held":true}}];
for(const test of cases){const actual=await run(test.input,test.corrected);assert.deepEqual(actual,test.expected);console.log(actual);}
按邊界依據作判斷
明訂2028 閏年月底邊界得二月二十九;跳過規則下一月三十一存在。規則欠缺就停。
- 核缺指定日時規則
- 按真正月長展開
- 記有輪次還是本來沒有
沒有明訂,不能自用月底替代。
| 條件 | 輸入 JSON | 預期輸出 JSON |
|---|---|---|
| 閏年明訂用月底 | {"year":2028,"months":[2],"day":31,"rule":"last-day"} | {"dates":["2028-02-29"]} |
| 三十一日實際存在 | {"year":2027,"months":[1],"day":31,"rule":"skip"} | {"dates":["2027-01-31"]} |
| 缺日期規則未訂 | {"year":2027,"months":[2],"day":31,"rule":null} | {"held":true} |
原例二月跳過,算工作失敗嗎?
查看參考答案
不是,按本例規則根本未生成二月輪次,不能當原本應有卻欠跑。