話題のメモ。
会社の若手さんと不具合の件で話していて
- 翌月末の日付を取得するのに、翌々月末になる事がある。
- JavaScriptの処理で、月末に「2ヵ月後」という指定をすると、3ヵ月後になるケースがあった。
という話から、JavaScriptのsetMonthという「日付情報の月だけを特定の月に変えた情報を取得する」という処理の話に。下記のサイトでその仕様と説明を見たのですが……
const event = new Date('August 19, 1975 23:15:30'); event.setMonth(3); console.log(event);
なぜか上記の処理で「4月19日」になるそうな……え?3って指定したのに!?
これですが、JavaScriptで月を表す数値を指定する場合は、0オリジン、要するに1月がゼロ、2月が1……という決まりで、0~11で指定するのだそうです。なんで?(笑)。たしかにECMAScriptの仕様を見ると
あぁ……。そしてその辺りの質問や回答も
こたえ「仕様です」。ブログを書いてる人も
「伝統的にそう」だそうで。そして上記サイトによるとJavaScriptの開発者の人は「JavaのDateに倣った」ということをおっしゃってるそうな。そうなんだ。Javaとは違うのだよ、って言われてるのに結局根元はJavaを参考にしとんのかい!!ww
@jasonstehle In case it helps (it doesn't for most), JS's Date is a copy of Java's JDK1.0 (1995) java.util.Date. Made it look like Java...
— BrendanEich (@BrendanEich) 2014年6月25日
これですが、どうやら英語圏の方々は日本人のように数字で月を指定しないことになれており、0で始まろうが別に違和感を持たないのかもしれないという話がどこかで出ていました。なるほど。JAN、FEB、MAR、APR……。略称で書けば別に面倒でもないし。逆に数字でいわれることの方が、日本人に対して「今度の如月3日だけどさ」みたいな言い方をするような違和感を感じるのかも、というようなことを言っている人もいました。なるほどなるほど。
でも、判りづらいですよJavaScript。もう少し開発者フレンドリーにやってくださいよ、というのは一日本人として思うわけです。