Featured image of post 為什麼Javascript的getMonth會是-1的

為什麼Javascript的getMonth會是-1的

來聊聊這令人匪夷所思的問題吧

前言

在一開始接觸Javasript,想要試圖做出一個小專案的菜雞,一定都會遇到這個令人無語的問題

1
2
var date=new Date()
date.getMonth() // 0

當你是一月時,這會回傳0,當你是12月時,你會回傳11,Why? Javascript Why?

brooklyn-nine-nine-terry-jeffords

抱著無聊的好奇心,我決定來去認真的查一下這個問題

萬惡之源

大家都會說Java跟Javascript的關係猶如臘腸與臘腸狗,除了名字一樣,兩者並沒有任何差距。但知道兩者發展歷史的人應該會知道,這兩個程式語言在歷史的某段時間確實是有一點關係的,而這也是為什麼Javascript的getMonth會是-1的起因之一。

大家都知道Javascript是Brendan Eich 用了十天就創造出來的語言,想當然而,這十天當然不是從無到有,當然是秉持著不自己造輪子,能抄就抄,能用就用的態度,在這種十天老闆就要看到成果的情形下,最現實的結果當然就是

「隨便從什麼語言裡面抓一個Date出來用」

而這個被選中的語言就是Java了

https://twitter.com/BrendanEich/status/481939099138654209

image-20230712180547633

https://twitter.com/BrendanEich/status/771006397886533632

image-20230712180614517

而他引進的版本就是JDK1.0的Date.Util,在那時候

1
2
Date date = new Date();
System.out.println("date.getMonth() = " + date.getMonth());

這東西確實就是會印出當前月份-1的結果(其實到現在Java17依然也是,為了要示範我只找得到1.8版本的JDK了)

demo

隨著Java版本的更迭,已經用新的Calendar來平移getMonth()的方法了,但師承Java的Javascript仍然保留著Java最原汁原味的那一份歷史,

image-20230712181628780

後來Brendan Eich也補充到,從Java import Date的這件事情並不是出自他的手,而是來自於網景一名員工的小巧思

https://twitter.com/BrendanEich/status/771006208949891072

image-20230712181804925

當之後有人在問為什麼Javascript的Month預設都會-1時,你就可以和對方分享這個小故事,並告訴對方寫程式要小心一點,難免你現在寫出來的Bug,在20年後變成大家習以為常的功能了>/////<

Licensed under CC BY-NC-SA 4.0