ゼロベースの月の番号付け[終了]


98

一部の一般的なプログラミング言語は、1だけ離れた月の番号付けを使用します-Javaと同様にJavaScriptが頭に浮かびます。いくつか質問があります。

  • laypeopleが使用する月の番号付けを無視する場合は、一貫性を保つために、laypeopleが使用する日付の番号付けも無視し、各月の日数を0から開始してください。
  • これはなぜそれほど一般的ですか?
  • そもそもこれは誰の考えでしたか?

配列、0から始まり、人々は日を数字で参照しますか?
glasnt

13
@TomatoSandwich:非常に多くの場合、は数字で参照され、1から始まります。
ロバートL

2
ちなみに、APIプログラマーは神ではありません。時には間違いが実装に入る。ただそれに対処します。これはまさにその通りであるわけではありません(どの言語を話すかさえも言わない)が、すべてが完璧であるとは期待しないでください。その理由を知りたいと思っています。
正午シルク

5
日本では、数字のみを使用します。1月、2月などは使用しません。西洋の世界でも、数字が頻繁に使用されます。私は彼らが再び話し言葉言語スタイルよりも配列スタイルを選択する別のプログラミング言語を作らないことを望みます。これは、何百万回も使用されることになるものに対する単純な修正です。
Wolfpack'08

1
ぶら下がり違反ではありませんが、これをした人は私の時間の10分を無駄にしただけで、中型のウェットフィッシュで平手打ちに値することに同意しました。
James McCormack

回答:


53

ゼロを使​​用してカウントを開始することは、実際にはアセンブリプログラマーによる最適化の秘訣です。カウントレジスタに1を割り当てる代わりに、レジスタ自体をXORしたため、CPUサイクルがわずかに高速でした。つまり、カウントは0から始まり、最後の要素を除いて常に要素の長さまでとなります。

また、ゼロの使用は、割り当てられたメモリを指す1つのベースポインターと、このベースポインターからのオフセットにある2番目のポインターを使用するポインター演算でも一般的です。ここで、値0を使用することは、オフセットをメモリブロックのベースにポイントするのに非常に意味があります。(一般的な配列ロジックは、ベースアドレス+オフセットxレコードサイズになる傾向があります。)

そして、ゼロベースの月数は?多くのプログラミング環境では、デフォルトのデータからの日数としてデータを計算することがよくあります。1899年12月31日は人気のある日付ですが、基準日として使用される他の日付もたくさんあります。他のすべての日付はこの基準からオフセットされており、単一の数値として格納されます。分数は、時間、分、秒を示すために使用されます。0.25は24/4 = 6時間です。したがって、日付を実際の日付に変換するには、環境でこの数値を実際の日付に変換するだけです。

ただし、0ベースの配列と1ベースの月の値の組み合わせには問題があります。月9の月名を取得するには、月の配列から項目8を取得する必要があります。一部の開発者は、名前を取得する前に月数を減らして満足しています。人々は数字ではなく名前を知りたいだけなので、月をゼロから始まるものに変更することを好む人もいます。それは個人的な見解です。


92
JavaScriptおよびAS3のDateコンストラクターは、「月」を除くすべての実際の値を取ります。理由は不明ですが、ゼロベースとして指定する必要があります。それは間違いなくひどいAPIデザインです。
Triynko

3
同意する。これは、私の日付が1か月だった理由を理解するのに1時間かかっただけです。月を除いてすべてが1であることは実際にはあまり意味がありません。残念ながら、おそらく修正不可能です。それ以外の場合は、別のY2K問題が発生します:-)。
マイクゴールド

1
TL; DR:なアレイのルックアップのmonthName[monthNumber]またはmon_name[tm_mon]有するTIME.H表記
ペルセウス

XOR-with-itselfは、ちょっとしたニシンです。それはIntelのものです。他のMPUには、レジスタをゼロにする他の方法がありました。いくつかは同様にそれらを1に設定する効率的な方法を持っていました。ゼロベースのものの主な理由は、インデックスの計算です。時々、それらは算術にも役立ちます。
alastair 2016年

6

それはそれであり、その仮定に基づいて構築されたソフトウェアの巨大な重みは、それがしばらくの間存在することになることを意味します。

私の意見では、これはCのせいで、他のすべてのJohnie-come-lately言語がCに準拠しただけだと思います。

あなたはよりよく知らない人々からいくつかの面白い状況を受け取ります。私たちのチームが見つけた数少ないY2Kバグの1つは、年の前struct tmに文字「19」を付けただけで年が19100であることを誇らしげに宣言したWebサイトでした。


少なくとも1人(私ではありません)が、スクリプトで使用する「getRealMonth」および「setRealMonth」関数を定義しています。私は彼を少し責めません。
ロバートL

1
Y2Kバグリファレンスに賛成票を投じます。
Justus Romijn、2014

4

はい、ローマ人もゼロの問題を抱えていました。

これは、単に最初の(問題の用語は1つ)の実、としてゼロを画定する数学の[非直感的な]結果(プログラミングの強い成分である、特に初期プログラミング) *自然数、およびアレイが実で索引付けされているので、「最初の」要素がインデックス0にある自然数

月は配列で実際に名前が付けられた値であり、日と年は番号付きの値です。日/年を{"1"、 "2"、 "3"のような配列であると考える方がおそらく便利でしょう。 ..}自身。

なぜこれが非常に一般的であるか(数学的に正しいことを除けば)、リストしたすべての言語は共通の起源から派生しています...

編集:

さらに詳しく見ると、このウィキペディアリンクは、ゼロインデックス付けのいくつかの優れた興味深い理由を詳細に示しており(これは、月がゼロインデックス付けされる理由を直接説明していませんが、すでにカバーされていると思います)、このSOリンクは以前の質問に回答しています。

誰の質問かによって、「歴史的な事故」か「月は数字ではないので、日/年の保管と比較できないから」という一般的な意見のようです。

*すみません、すみません、物理学!手をアイロンがけしてください。


5
ゼロは正数ではありません。また、負の数でもありません。
Robert L

良い点ですが、おそらく「自然数」に変更する必要があります。
paxdiablo 2009

1
面白い、私はいつもCの配列はポインタ演算を簡素化するために0から開始することを考えていた:a[0]== *(a + 0)
phpが多すぎる

2
実際、コンピューティングでは、1の補数システムを使用する場合、正と負のゼロを持つことができます。幸い、そのシステムはほとんど二度と使用されません。en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink

私たちの文化では、月も日です。年の最初の月は実際には「1(st)month」と呼ばれ、最後の月は「12(th)month」と呼ばれます
Michael Tsang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.