日にちの数え方
-
0 名前: 黒頭巾 : 2007/01/09(火) 04:00 ID:Q40x1jSS
- getDate()は1から始まります。これだけゼロスタートでないのは不思議です。
でも、機械の中ではゼロから始めてるんですよね?
-
1 名前: 匿名 : 2007/01/09(火) 04:00 ID:Rt.j/.AI
- > これだけゼロスタートでないのは不思議
日付が 0 から始まっても不便なだけだと思うよ。
じゃあ、何で getMonth() は 0 から始まるのか? 答えは簡単、欧米では月を番号(1 月、2 月、...)ではなく名前(January、February、...)で呼ぶから。
また、日本では曜日を名前(月、火、...)で呼ぶが、国によっては番号(第一日、第二日、...)で呼ぶ。そういう国出身の人にとっては、getDay() が 0 から始まるのは不便だろうね。
> 機械の中ではゼロから始めてるんですよね?
別に、言語の中には配列を 1 から数えるものも珍しくない(XSLT、FORTRAN)。ついでに言えば、JavaScript では任意の位置から始めることもできる。
配列が 0 から始まるのは、プログラミング言語 C の影響が大きい。C の配列 a[i] の i は配列の先頭ポインタからのオフセット位置(a[i] == *(a + i))、平たく言えば「最初の要素から数えて何番目か」を表す。
-
2 名前: 匿名 : 2007/01/09(火) 04:00 ID:Rt.j/.AI
- 質問の意味を取り違っていた気がするので、>>1 は撤回。
>>0
> 機械の中ではゼロから始めてるんですよね?
いや、Date オブジェクトの内部では、1970-01-01 00:00:00:0000 を基準時とするミリ秒を保持している。たとえば、2006-01-09 08:30:00:0000 は、基準時から 1136763000000 ミリ秒経過した時刻となる。
getDate() や getDay() などが呼ばれた場合、このミリ秒からの計算値を返す。具体的な計算方法は以下で規定されている。
http://www2u.biglobe.ne.jp/%7Eoz-07ams/prog/ecma262r3/15-9_Date_Objects.html
だから、内部処理されているのはミリ秒だけであり、年月日時分秒のそれぞれが 0 から計算されているわけではない。だからこそ「100 日前」なんてのも、date.setDate(date.getDate() - 100) で簡単に計算できるわけだ。
> これだけゼロスタートでないのは不思議
>>1 にも書いたが、暦文化的に名前が必要になるもの('January'、'Sunday'、'睦月'、'日曜日')に関しては、0 から始めた方が配列で扱いやすい、というだけ。日付に関しては、0 から始める必要もメリットもない。