日期清單產生器是一個小巧的工具,能將兩個日曆端點與一個以「整天」為單位的步進,轉成一組完整、可預期的日期清單——每行一個日期——不會發生時區位移、不抽樣、也不會悄悄截斷。它會讀取從西元 0001 年到 9999 年、嚴格的 YYYY-MM-DD 格式輸入,從原始起點開始以固定的「天數」間隔推進,並輸出每一個符合資格的日曆日期,直到抵達終點或額度用完為止。兩個端點本身都符合資格,但只有當所選步進恰好落在終點時,終點才會出現;摘要會告訴你是哪一種情況。「Date List Generator」會在你的瀏覽器中以「推算格里高利曆」(proleptic Gregorian calendar)——也就是 HTML 日期輸入欄位與 ISO 日曆日期所使用的那套無時區模型——完成這些工作,因此在東京輸入的一月,與在倫敦讀到的一月會是同一個一月。正是這個特性,讓輸出可以被稽核:相同的輸入,在每一台裝置、每一個語系、每一次都會產生完全相同、可複製的文字。

日期清單產生器真正在做什麼
這份工作範圍刻意做得很窄。你提供一個起點、一個終點,以及一個以「整天」為單位的步進給工具。它會回傳這兩點之間精確的日曆日期序列,依照時間順序排列,格式為嚴格的 YYYY-MM-DD,每行一個日期。沒有時間戳記、沒有「時分秒」欄位、沒有隱式的地區語系解析,也不會「聰明地」略過週末或國定假日。
在這裡最關鍵的詞是「可預期」(deterministic)。給定 2025-01-01、2025-01-31,以及步進 7,輸出永遠是同一組五個日期、同樣的順序、同樣的標籤。沒有可重新搖的隨機種子、沒有會偷偷漏掉一列的分頁機制,也沒有會悄悄把月份界線四捨五入的模糊區間。「Date List Generator」會把這個契約說清楚並確實遵守:相同的輸入進來,就會得到相同的清單出去。
產生器背後的日曆模型
大多數日期工具會默默地把日曆日期轉成 Unix 時間戳記,再轉回來。那個轉換正是 bug 容易滋生的地方,因為時間戳記代表的是「某一個時間點」,而不是「某一個日期」。同一個瞬間跨越時區邊界時,印出來的日期可能會整整偏移一天。
「Date List Generator」則完全繞過這個問題:它把每一個項目都視為「推算格里高利曆」上的一個日曆日期。WHATWG HTML 標準 對日期輸入值也採用相同的模型,ISO 8601 與 RFC 3339 的完整日期表示法也是相同的形狀。既然沒有要表示某一個瞬間,就不會有時差、不會有日光節約時間的切換、也不會有會偷偷改寫你輸入內容的地區語系解析器。
可接受的輸入格式很嚴格:四位數年份、兩位數月份、兩位數日期——也就是 YYYY-MM-DD。支援的年份範圍從 0001 到 9999。日期驗證會依據每個月的實際天數進行,包含閏年規則:能被 4 整除的年份是閏年,除非它也能被 100 整除;而能被 400 整除的年份仍然是閏年。因此 2000-02-29 是合法日期,1900-02-29 則不合法。產生器不會把像 2025-04-31 這種不可能存在的日期悄悄改成 5 月 1 日;該請求會被拒絕,不會計算數量,也不會產生部分輸出。
數學原理:從日期到序數,再回到日期
在開始建構任何一列輸出之前,瀏覽器會先把每一個合法的端點轉換成「以 1 為起始」的序數——也就是從一個固定參考點起算的天數整數計數。兩個序數的差,就是它們之間精確的天數。這個序列會產生的列數,會用 floor((endOrdinal − startOrdinal) / step) + 1 來計算。
這個數量會在配置之前先和結果額度進行比對。「Date List Generator」最多接受 10,000 個日期,任何會超過這個上限的請求都會被拒絕;產生器會以計算出來的數量失敗回傳,不會回傳部分清單。沒有「只回傳第一頁」的模式、沒有省略列、也不會悄悄截斷尾端。如果你的範圍會產生 10,001 列,你會收到一個乾淨的拒絕,而不是 10,000 列的意外驚喜。
接著,每一個選中的序數會透過「以年份做二分搜尋」加上「逐月減去各月天數」的方式,轉回格里高利曆的年、月、日,並把該行格式化回嚴格的 YYYY-MM-DD。每一列輸出都會依據相同的日曆規則獨立驗證,這代表結構上不可能產生格式錯誤的輸出列。選擇性的「星期幾」標籤會從同一個序數、以 (ordinal − 1) 模 7 計算得出,並以 0001-01-01 作為星期一。七天的步進會保留星期幾,因為一個格里高利週恰好是連續七個日曆日。步進是從原始起點開始套用,不會反覆被四捨五入到月份界線,因此從一月 30 開始、步進為二時,會得到一月 30、二月 1、二月 3,依此類推。
使用「Date List Generator」建立日期清單
接下來是實作的部分。Date List Generator 把整個工作流程精簡為三個輸入和一組輸出。
- 選擇合法的起點與終點日期,並確保終點等於或晚於起點。請使用嚴格的 YYYY-MM-DD 格式;挑選一個能涵蓋你實際需要範圍的起點與終點。
- 輸入介於 1 到 366 之間的整數天數步進,可選擇性地加上星期幾名稱,然後產生完整的序列。步進為 1 會列出每一個符合資格的日期,7 會產生每週序列,較大的數值則會產生規則的自訂間隔。
- 檢查步進是否恰好落在終點日期上,然後把「每行一個」的輸出複製到你的工作流程中。摘要列會告訴你終點是否被納入,或是序列剛好停在終點之前;你可以把文字直接貼到試算表、排程草稿、測試 fixture 或內容規劃中。
解讀結果與常見模式
產生之後,第一件要看的是摘要列。它會告訴你產生了多少個日期,以及是否恰好抵達終點日期。如果步進是 1,終點永遠會被納入。如果步進是 7,且範圍的寬度不是七的倍數,終點通常不會被納入,而這是預期中的行為——產生器會回報這個事實,而不是去補齊或修剪。
| 步進值 | 對序列的影響 | 典型用途 |
|---|---|---|
| 1 | 範圍內的每一個日曆日期 | 每日紀錄、出勤、內容發布節奏 |
| 7 | 每個 ISO 週一個日期,每次都是同一個星期幾 | 每週站會、每週報告 |
| 14 | 雙週一次,同一個星期幾 | 雙週檢討、衝刺界線 |
| 30 | 近似每月,以天數計算 | 粗略的每月檢查點 |
| 90 | 近似每季,以天數計算 | 每季里程碑 |
精確的數字取決於你的起點、終點與步進——上表描述的是這個關係,而不是具體數量。產生器在每次執行後都會列出實際數量。
以下是一個你可以重現的單一計算範例。取範圍 2025-01-01 到 2025-01-31,步進為 7。
- 第 1 天 + 0 × 7 = 2025-01-01
- 第 1 天 + 1 × 7 = 2025-01-08
- 第 1 天 + 2 × 7 = 2025-01-15
- 第 1 天 + 3 × 7 = 2025-01-22
- 第 1 天 + 4 × 7 = 2025-01-29
- 第 1 天 + 5 × 7 = 2025-02-05,已超過 2025-01-31,因此序列停止。
因此,這份清單包含 5 個日期,且 2025-01-31 沒有被納入,因為從一月 1 開始的 7 天步進無法落在 1 月 31 日上。摘要會回報 5 列,並標示終點未抵達。如果開啟星期幾標籤,每一行還會帶上其英文星期幾——這個例子中是星期三,因為 2025 年 1 月 1 日是星期三,而 7 天步進會保留星期幾。標籤是固定的英文名稱,而不是依瀏覽器語系而定的字串,因此相同的輸入在每一台裝置上都會產生相同、可複製的輸出。它們只會改變顯示的那一行,不會改變序列本身。
這個產生器「不」做的事
了解一個工具「不是」設計來做什麼,是用好它的一半。「Date List Generator」不是約會排程器、不是工作日計算機、不是假日日曆、不是週期規則引擎,也不是時區轉換器。它不認識營業時間、市場交易時段、宗教曆、學校曆、各地區假日、閏秒,也不知道你的位置。它絕不會略過週末、不會移除國定假日,也不會推測「工作日」。
它同樣不處理「月」或「年」的步進,因為像「一個月」這種單位需要對 1 月 31 日或 2 月 29 日這類日期定義溢位規則。日曆月與日曆年的算術屬於「Date Add Subtract Calculator」的範疇,該工具正是圍繞著那個溢位規則所打造。對於需要商業規則的循環日期模式,你需要的是排程引擎,而不是日期清單。
這個區別在實務上之所以重要,是因為:一份每日清單並不等於「清單上的每一天都可用或都可運作」。請把輸出當作原料,再根據目的系統的規則檢視後才匯入——尤其當涉及截止日、薪資、出差、財務或法律義務時更是如此。
輸出在實務上會到哪裡
一旦你有一份乾淨的清單,常見的去處就是本機檔案與工作表。把它貼進試算表,作為公式與樞紐分析表的日期欄種子。把它放進 CSV 作為測試 fixture。用它作為內容規劃、編輯日曆或發布時程的骨架。餵給需要確定性種子日期的建置腳本。由於輸入格式與輸出格式都是同一種嚴格的 YYYY-MM-DD,你也可以把輸出直接回灌到產生器當作新的端點,不需要任何轉換步驟。
如需一份把每個輸入、步進與限制都整理在同一頁的單頁參考資料,Date List Generator 速查表:輸入、步進、限制 這篇文章與本總覽是絕佳的搭配。
所有解析、計算、星期幾推算、格式化與複製的動作,都在當前的瀏覽器分頁中執行。這個小工具不會上傳或儲存任何日期範圍,因此即使輸出會用於敏感的規劃,也不必經過伺服器往返。只有在你按下按鈕之後,複製動作才會要求剪貼簿權限;如果權限被拒,畫面上那個唯讀的文字區塊仍然可以用手動選取並貼上。這份「僅限本機」的契約,正是為什麼這份輸出適合用於薪資測試資料、fixture 種子,以及任何日期本身具有重要性的工作流程。