从零开始的月份编号


98

某些流行的编程语言使用的月份编号相差1 – Java和Java一样,要想到的是JavaScript,如果提供内存,则C是另一个。我有一些问题:

  • 如果您要忽略外行人使用的月份编号,那么为什么出于一致性考虑,也要忽略外行人使用的日期编号,并从0开始对每个月中的天数进行编号?
  • 为什么这么常见?
  • 首先是谁的主意?

数组从0开始,人们用数字来指代日子吗?
glasnt

13
@TomatoSandwich:人们经常用数字来表示月份,并且他们从1开始编号。
罗伯特L

2
顺便说一下,API程序员不是神。有时错误会混入实现中;只是处理它。并不是说这确实是一个案例(您甚至不说什么语言),但不要指望一切都是完美的。我很佩服,但是想知道原因。
中午丝绸

5
在日本,他们只使用数字。他们不使用一月,二月等。西方世界也经常使用数字。我希望他们不要再使用另一种选择数组样式而不是口头语言样式的编程语言。对于要使用数百万次的事物来说,这是如此简单。
Wolfpack'08

1
商定,虽然不是一项犯罪行为,但这样做的人只不过浪费了我十分钟的时间,因此值得与一条中型湿鱼打一巴掌。
詹姆斯·麦考马克2014年

Answers:


53

使用零开始计数实际上是Assembly程序员的一种优化技巧。他们没有将1分配给计数寄存器,而是对其进行了异或运算,这在CPU周期中略快。这意味着计数将从0开始,并且始终取决于元素的长度(不包括最后一个元素)。

同样,在指针算术中也使用零,在这种情况下,您将使用一个基本指针指向某些已分配的内存,再加上第二个指针,该指针与该基本指针的偏移量。在这里,使用零值将偏移量指向存储块的基数很有意义。(一般的数组逻辑往往是基地址加上偏移量x记录大小。)

从零开始的月份数字?通常,许多编程环境自某些默认数据起将数据计算为天数。1899年12月31日是一个受欢迎的日期,尽管还有许多其他日期用作基准日期。所有其他日期都偏离此基准,并且将仅存储为一个数字。分数将用于表示小时,分钟和秒,其中0.25表示24/4 = 6小时。因此,要将日期转换为真实日期,所有环境要做的就是将此数字转换为真实日期。

但是,基于零的数组和基于1的月份值的组合确实带来了问题。要获得第9个月的月份名称,您必须从month数组中获得第8项。一些开发人员会很乐意在获得名称之前减少月份数。其他人则倾向于将月份更改为从零开始的名称,因为人们只想知道名称,而不是数字。这是个人观点。


92
JavaScript和AS3 Date构造函数对除“月”以外的所有内容都采用真实值,由于未知的原因,必须将其指定为从零开始的值。毫无疑问,这是一个糟糕的API设计。
Triynko 2013年

3
我同意。我花了一个小时试图弄清楚为什么我要约会一个月。除了月份以外,一切都以1为基数并没有多大意义。不幸的是,它可能无法解决,否则我们将面临另一个Y2K问题:-)。
麦克金

1
Tl; dr:由于数组查找monthName[monthNumber]mon_name[tm_mon]使用time.h表示法
英仙座

与自身进行异或的过程有点像是鲱鱼。这是英特尔的事情。其他MPU可以通过其他方式将寄存器清零。有些人也有有效的方法将它们设置为1。从零开始的事物的主要原因是索引计算。有时它们对算术也很有用。
alastair

6

就是这样,基于此假设而构建的庞大软件意味着它将持续一段时间。

我的看法是这是C的错,所有其他后来才出现的语言也都遵循了C。

您会从不了解的人那里得到一些有趣的情况。我们的团队发现的少数Y2K错误之一是一个网站,自豪地宣称年份为19100,因为它们在struct tm年份之前加上了文字“ 19”。


至少有一个人(不是我)已定义“ getRealMonth”和“ setRealMonth”函数供其脚本使用。我一点也不怪他。
罗伯特L

1
升级以获取Y2K错误参考。
Justus Romijn 2014年

4

是的,罗马人也有零问题。

只是数学(是程序设计的重要组成部分,尤其是早期程序设计)的[非直觉]结果,将零定义为第一个(有问题的术语是一个)实数, *自然数,并且由于数组使用实数索引,自然数,“第一个”元素位于索引0。

月实际上是数组中的命名值,其中天和年是编号值-将天/年看作是看起来像{“ 1”,“ 2”,“ 3”,...的数组可能会更有用。 .. } 他们自己。

至于为什么这是如此普遍(除了数学上正确),所以您列出的所有语言都是出于同一原因而起源的……

编辑:

进一步研究,此Wikipedia链接详细说明了零索引的几个好而有趣的原因(这并没有直接说明为什么月被零索引了,但我认为这已经涵盖了),并且此SO链接已经回答了之前的问题。

看起来流行的观点是“历史性事故”还是“因为月份不是数字,所以不能与日/年存储进行比较”,具体取决于您问谁。

*对不起,对不起,物理学!=有事再来咬我。现在去熨烫我的手。


5
零不是正数。它也不是负数。
罗伯特L

好点,也许您应该将其更改为“自然数”。
paxdiablo

1
有趣的是,我一直认为C数组从0开始以简化指针算法:a[0]== *(a + 0)
太多的PHP

2
实际上,在计算中,如果使用Ones的补码系统,则可以有正零为负。幸运的是,该系统几乎不再使用。见en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
维姆10布林克

在我们的文化中,月份也是一个数字。一年中的第一个月实际上称为“第一个月”,最后一个称为“第十二个月”
曾荫权
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.