Date 基于零的月份编号

Date 基于零的月份编号,date,language-agnostic,language-design,Date,Language Agnostic,Language Design,一些流行的编程语言使用的月份编号是以1为单位的——JavaScript就像Java一样,如果内存可用,C是另一种。我有一些问题: 如果您要忽略非专业人员使用的月份编号,那么为了保持一致性,为什么不忽略非专业人员使用的日期编号,并从0开始对每个月的日期进行编号 为什么这种情况如此普遍 这是谁的主意 它就是这样,按照这个假设构建的巨大软件重量意味着它将存在一段时间 我的观点是,这是C语言的错,所有其他的Johnie最近出现的语言都与C语言一致 你会从那些不太了解情况的人那里得到一些有趣的情况。我们

一些流行的编程语言使用的月份编号是以1为单位的——JavaScript就像Java一样,如果内存可用,C是另一种。我有一些问题:

  • 如果您要忽略非专业人员使用的月份编号,那么为了保持一致性,为什么不忽略非专业人员使用的日期编号,并从0开始对每个月的日期进行编号
  • 为什么这种情况如此普遍
  • 这是谁的主意

它就是这样,按照这个假设构建的巨大软件重量意味着它将存在一段时间

我的观点是,这是C语言的错,所有其他的Johnie最近出现的语言都与C语言一致


你会从那些不太了解情况的人那里得到一些有趣的情况。我们小组发现的少数几个Y2K错误之一是一个网站自豪地宣布年份为19100年,因为他们在
struct tm
year的前面加了一个字母“19”。

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

这只是数学(是编程的重要组成部分,尤其是早期编程)将零定义为第一个实数、正数*自然数(有问题的术语)的一个[非直观]结果,因为数组是用实数、自然数索引的,“第一”元素位于索引0处

月份实际上是数组中的命名值,其中天和年是编号的值——如果将天/年看作是在类似于{“1”、“2”、“3”、…}本身的数组中,可能会更有用

至于为什么这是如此普遍(除了在数学上是正确的),那么你列出的所有语言都来自一个共同的起源,一件事

编辑:

进一步研究,这个链接详细介绍了零索引的几个好的和有趣的原因(这并没有直接说明为什么月份是零索引的,但我认为已经讨论过了),这个链接以前回答过这个问题

看起来流行的观点要么是“历史事故”,要么是“因为月份不是数字,所以无法与日/年存储量进行比较”,这取决于你问谁


*对不起,对不起,物理=数学又回来咬我了。现在就动手吧。

使用零开始计数实际上是汇编程序员的一种优化技巧。他们没有将1分配给计数寄存器,而是将寄存器与自身进行异或运算,这在CPU周期上稍微快一点。这意味着计数将从0开始,并且始终等于元素的长度,不包括最后一个元素

此外,零的使用在指针算术中也很流行,在指针算术中,您将使用一个指向某个分配内存的基指针,再加上一个位于该基指针偏移量处的第二个指针。在这里,将偏移量指向内存块的底部非常有意义。(常规阵列逻辑倾向于基址加上偏移量x记录大小。)

以零为基础的月数呢?通常,许多编程环境将数据计算为一些默认数据之后的天数。1899年12月31日是一个受欢迎的日期,尽管还有很多其他日期用作基准日期。所有其他日期都会从该基数偏移,并且只会存储为一个数字。分数将用于表示小时、分钟和秒,其中0.25表示24/4=6小时。因此,要将日期转换为实际日期,环境所要做的就是将该数字转换为实际日期


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

数组,从0开始,人们用数字来表示天数?@TomatoSandwich:通常人们用数字来表示月份,从1开始计算。顺便说一句,API程序员不是神;有时错误会影响到实现;处理好它。并不是说这完全是一种情况(你甚至不说什么语言),但不要期望一切都是完美的。但我很想知道原因。在日本,他们只使用数字。他们不使用一月、二月等。西方世界也经常使用数字。我希望他们再也不要开发出另一种选择数组风格而不是口语风格的编程语言。这是一个简单的解决方案,它将被使用数百万次。同意,虽然不是绞刑罪,但无论谁这样做都浪费了我十分钟的时间,应该被一条中等大小的湿鱼扇一巴掌。零不是一个正数。它也不是负数。说得好,也许你应该把它改为“自然数”。有趣的是,我一直认为C数组从0开始以简化指针运算:
a[0]
==
*(a+0)
。实际上,在计算中,如果使用1的补码系统,你可以得到正零和负零。幸运的是,这个系统几乎再也没有被使用过。在我们的文化中,月也是一个数字,就像天一样。一年中的第一个月实际上被称为“第一个月”,最后一个月被称为“第十二个月”。至少有一个人(不是我)定义了“getRealMonth”和“setRealMonth”函数,以便在他的脚本中使用。我一点也不怪他。请投票支持Y2K错误引用。JavaScript和AS3日期构造函数为“除”月份之外的所有内容获取实际值,由于未知原因,必须将月份指定为零。这无疑是一个糟糕的API设计。我同意。我花了一个小时想弄明白为什么我的约会已经过了一个月。除了这个月之外,一切都以1为基础并没有多大意义。