基于零的月份编号

Rob*_*t L 98 language-agnostic language-design date

一些流行的编程语言使用月份编号,这个编号是1 - JavaScript会想到,Java也是如此,如果内存服务,则C是另一种.我有一些问题:

  • 如果你要忽略非专业人士使用的月份编号,为什么不为了一致性而忽略了外行人使用的日期编号,并从0开始每个月的天数?
  • 为什么这么常见?
  • 首先是谁的想法?

Wim*_*ink 52

使用零开始计数实际上是程序员程序员的优化技巧.它们不是将1分配给计数寄存器,而是将寄存器与其自身进行异或,这在CPU周期中稍微快一些.这意味着计数将从0开始,并且总是达到元素的长度,不包括最后一个.

此外,使用零也很受指针算术的影响,你可以使用一个指向某个已分配内存的基指针,再加上一个与该基指针偏移的第二个指针.在这里,使用零值很有意义将偏移量指向内存块的基数.(通用数组逻辑往往是基址加偏移x记录大小.)

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

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

  • JavaScript和AS3日期构造函数为月份以外的所有内容采用实际值,由于未知原因必须将其指定为从零开始.毫无疑问,这是一个糟糕的API设计. (91认同)
  • 我同意.这只花了我一个小时试图找出为什么我的约会是一个月.除了本月之外,对于所有基于1的所有内容来说并没有多大意义.不幸的是,它可能无法修复,否则我们最终会遇到另一个Y2K问题:-). (3认同)
  • Tl; dr:因为数组查找 `monthName[monthNumber]` 或 `mon_name[tm_mon]` 与 [time.h notation](http://www.cplusplus.com/reference/ctime/asctime/)。 (2认同)

pax*_*blo 6

它就是这样,并且为这个假设而构建的软件的巨大重量意味着它将会存在一段时间.

我的观点是,这是C的错,所有其他Johnie-come-late语言都符合它.

你会从那些不太了解的人那里得到一些有趣的情况.我们团队发现的为数不多的Y2K错误之一是一个自豪地宣称年份为19100的网站,仅仅是因为它们以struct tm字面"19" 为前缀.