所以我花了几个小时愤怒地弄清楚为什么我的代码不能正确写入/sys/class/rtc/rtc0/wakealarm
。问题是如果值错误,它不会返回任何内容。最后我注意到这个小
5
年和日之间。为什么不从零开始计算天数和年份以保持一致性?
为了比较:QCalendarWidget 计数月份从 1 到 12(文档)
答案1
GtkCalendar 文档:http://developer.gnome.org/gtk/2.24/GtkCalendar.html
零基的一般解释:
使用零开始计数实际上是汇编程序员的优化技巧。他们没有将 1 分配给计数寄存器,而是将寄存器与自身进行异或,这在 CPU 周期中略快一些。这意味着计数将从 0 开始,并且始终达到元素的长度(不包括最后一个元素)。
此外,零的使用在指针算法中也很常见,在指针算法中,你会使用一个指向某个已分配内存的基指针,加上一个与该基指针偏移量的第二个指针。在这里,使用值零来将偏移量指向内存块的基址非常有意义。(一般数组逻辑往往是基址加上偏移量 x 记录大小。)
那么从零开始的月份数字呢?通常,许多编程环境会将数据计算为自某些默认数据以来的天数。1899 年 12 月 31 日是一个常用的日期,尽管还有许多其他日期用作基准日期。所有其他日期都与此基准偏移,并且将仅存储为一个数字。分数将用于表示小时、分钟和秒,其中 0.25 表示 24/4 = 6 小时。因此,要将日期转换为实际日期,环境所要做的就是将此数字转换为实际日期。
但是,从零开始的数组和从 1 开始的月份值的组合确实带来了问题。要获取第 9 个月的月份名称,您必须从月份数组中获取第 8 项。有些开发人员乐于在获取月份名称之前减少月份数字。其他人则倾向于将月份更改为从零开始的数字,因为人们只想知道名称,而不是数字。这只是个人观点。
此外,人们认为日期/日历有问题的原因不止一个:
- 令人惊讶的基数(1900 作为 Date 中的年份基数,诚然对于已弃用的构造函数而言;0 作为两者中的月份基数)
- 可变性 - 使用不可变类型使得处理真正有效的值变得更加简单
- 类型集不足:将日期和日历作为不同的东西是很好的,但是缺少“本地”和“区域”值的分离,以及日期/时间与日期与时间的分离
- 一个 API 会导致代码丑陋,其中包含魔法常量,而不是明确命名的方法
- 这是一个很难推理的 API——所有业务都是关于何时重新计算等等
- 使用无参数构造函数默认为“now”,这会导致代码难以测试
答案2
这是整个“包容”或“排他”的讨论他们可能使用该系统来计算已经过去了多少个月。
例如,如果您说已经过去了 1 个月,那么您现在就是一年中的第二个月。因此,如果您需要一个程序来计算过去了多少个月,并且您使用的是 1-12 系统,那么它会报告您处于 1 个月(1 月),而不是 0 个月(1 月)过去,并且需要执行额外的函数来确定已经过去了多少时间。
就像《时空之轮》中的思维谜题一样,http://www.youtube.com/watch?v=Ll1uAla90BU&t=13m42s,这取决于你如何计算,如果你从开始计算,或者当你完成时计算,它可能会产生极大的误导。
因此,对于编码来说,从 0 开始更容易,在图中你数到三,但在第一张图片中,它只加起来是 2 个完整的周期(月份),而在第二张图片中你数到 3,但从 0 开始,加起来是 3 个完整的月份。
这也是每个人计算年龄的方法,从 0 开始,一年后变为 1。
至于为什么他们不把天数和年数也算进去呢?我猜是因为一个月的天数是可变的,所以天数的计算是分开的,如果按天数来算,这也使得很难计算已经过去了多少个月。如果你计算了过去了多少个月,你就可以准确地计算一年的时间,也就是说,如果你准确地计算了月份,你就可以准确地计算年份,一年有 12 个完整的月份,从 0 开始计数,一旦你数到 12,你就循环回到 0,所以数字将是 10 11 0 1 2 3 ... 就像下面的图片一样,如果你数到 2 然后重新开始 -
无论如何,简而言之,程序员只是做对他们来说最简单的事情。