Date
以下の呼び出しを使用してJavaScriptで新しいオブジェクトを初期化すると、月の引数がゼロから始まることがわかりました。
new Date(2010, 3, 1); // that's the 1st April 2010!
月の引数が0から始まるのはなぜですか?一方、月の引数(最後の日)は1から31までの数字です。これには正当な理由がありますか?
the Day of the week (integer)
0-6です
Date
以下の呼び出しを使用してJavaScriptで新しいオブジェクトを初期化すると、月の引数がゼロから始まることがわかりました。
new Date(2010, 3, 1); // that's the 1st April 2010!
月の引数が0から始まるのはなぜですか?一方、月の引数(最後の日)は1から31までの数字です。これには正当な理由がありますか?
the Day of the week (integer)
0-6です
回答:
これは、プログラミングの世界では古い(おそらく不幸な、おそらく死にかけている)伝統です。古い標準(POSIX)のlocaltime C関数http://linux.die.net/man/3/localtimeを参照してください
Date
オブジェクトがJava 1.0から移植されたのはそのためです。そのすべての欠陥を継承... stackoverflow.com/questions/344380/...
この質問に対する本当の答えはjava.util.Date
、これもからコピーされたものであり、これにもこの癖があったことです。プルーフは、最初にJavaScript(Date
オブジェクトを含む)を実装したBrendan EichのTwitterで見つけることができます。
https://twitter.com/BrendanEich/status/481939099138654209
https://twitter.com/BrendanEich/status/771006397886533632
これは1995年に起こり、JDK 1.0はベータ版でした。それは1996年に発売されました。1997年に、JDK 1.1がリリースされ、ほとんどの機能が非推奨になりjava.util.Date
、に移行しましたがjava.util.Calendar
、それでもゼロベースの月がありました。これにうんざりしている開発者は、Joda-Timeライブラリを作成し、最終的java.time
にJava 8(2014)に組み込まれたパッケージにつながりました。
つまり、Javaが正しく設計された日付/時刻APIを組み込むのに18年かかりましたが、JavaScriptは依然として暗い時代に立ち往生しています。確かに、Moment.js、date-fns、js-jodaなどの優れたライブラリーがあります。しかし、今のDate
ところ、言語に組み込まれていること以外には何もありません。うまくいけば、これは近い将来に変わるでしょう。
日を除くすべてが0ベースです。範囲を含む完全なリストについては、こちらをご覧ください :)
ここで実際に奇数ボールであるのは1ベースの日です...奇妙なことに十分です。なぜこれが行われたのですか?わからないけど、たぶん彼らが漆喰になったのと同じ会議で、セミコロンはオプションだと決めた。
{ "first", "second", "third", ..., "twenty-seventh", ... }
)、それをでインデックス付けしようとしないためtm_mday
です。繰り返しになりますが、たぶん彼らは、1つのエラーを定期的に発生させる絶対的な効用を見ただけかもしれません。
1年は常に12か月であるため、初期のC実装では、インデックス0..11の静的な固定幅配列を使用した可能性があります。
元の質問に対する答えではないことはわかっていますが、この問題に対する私の好ましい解決策をお見せしたかっただけです。
小さな関数zerofillは、必要に応じてゼロを埋めるトリックを行い、月が+1
追加されます。
function zerofill(i) {
return (i < 10 ? '0' : '') + i;
}
function getDateString() {
const date = new Date();
const year = date.getFullYear();
const month = zerofill(date.getMonth()+1);
const day = zerofill(date.getDate());
return year + '-' + month + '-' + day;
}
しかし、はい、日付にはかなり直感的なAPIがあり、ブレンダンアイヒのTwitterを読んでいたとき、私は笑っていました。
関連付けられている名前がないため、月は列挙型(最初のインデックスは0)であり、日ではないと見なした可能性があります。
むしろ、彼らはその日の数がその日の実際の表現であると考えました(月が12/31のような日付の数字として表されるのと同じように) 0ベース。
したがって、実際には、月については、適切な列挙表現は数字ではなく月の名前を使用することであると考え、日が名前表現を持っている場合も同じようにしました。1月5日、1月6日、1月5日、1月6日などではなく、1月5日、1日6日と言ったとしたら、おそらく、それらも数日間0ベースの列挙を行っていたでしょう...
おそらく無意識のうちに、数か月の列挙を{January、February、...}として、日を{One、Two、Three、...}として考えました。 1 for Oneなどのように、0から開始することは不可能です...
これは欠陥かもしれませんが、月または曜日を文字列として表現したい場合にも非常に便利です。['jan、' feb '... etc] [new Date()のような配列を作成できます。 [''、 'jan'、feb ... etc] [new Date()。getMonth()]の代わりに.getMonth()]または['jan'、 'feb' ... etc] [new Date( ).getMonth()-1]
月の日には通常名前が付けられないため、それらの名前で配列を作成することはありません。この場合、1-31の方が扱いやすいので、毎回1を引く必要があります...