Hacker News 上看到「History of Zero-Based Months? (jefftk.com)」這篇,在考古為什麼常常看到 function 在傳回「月份」時是以 0
表示一月。從這篇提到的「Why is day of the month 1-indexed but the month is 0-indexed in C? (twitter.com/hillelogram)」則是 2020 年的討論。
在討論裡面有提到 hillelogram 的 tweet,裡面有個看起來算合理的考古過程...
試著用 Thread Reader 產生單頁 (讀起來會比較好讀),但不知道為什麼一直失敗,結果往 Internet Archive 翻資料,倒是有 2020 年當初生成出來的版本。
另外還是列出原來第一則 tweet:
Okay, I put WAY too much time into researching this, and I almost know what's happening. ALMOST.
First of all, JavaScript does this for legacy reasons. In C's <time.h> we have `struct tm`, which does the same thing.
But why?
We see the rabbit hole, time to jump in. https://t.co/fZO3HXfZTN
— Hillel (@hillelogram) November 19, 2020
作者在研究這個題目的時候,馬上可以想到的是 C 語言裡面的月份就是 0-indexed,而其他程式語言都很有可能會是因為 C 語言的關係一路把這個特性繼承下去:
直接跳到最後面作者的猜測,他覺得可能是為了讓後續使用起來更方便的關係。
其他的欄位大多都是透過類似 sprintf("%d")
的方式直接輸出數字,所以用 1-indexed 讓人直接讀,而月份則會透過 array 來轉字串,所以用 0-indexes 讓程式轉:
So that's my best guess: the programmers were working with constrained resources and could optimize `asctime` tricky pointer arithmetic on the month and day-of-week, so made them 0-indexed. Day-of-month is just for displaying to the user, so is 1-indexed.
沒辦法確定,但就是一種猜測,看起來還蠻... 合理... 的?