为什么Java日历中有1月份0?

问题:

java.util.Calendar中,1月被定义为0个月,而不是1个月。有什么具体原因吗?
我看到很多人对此感到困惑…

回答:

这只是Java日期/时间API的可怕混乱的一部分。列出什么问题需要很长时间(我确定我不知道一半的问题)。诚然,在日期和时间的工作是棘手的,但是反正。
自己动手,使用Joda Time而不是JSR-310
编辑:至于原因 – 正如其他答案所指出的那样,这可能是因为旧的C API,或只是从0开始的一般感觉,除了那天从1开始,当然。我怀疑原有执行团队之外的任何人是否真的可以说出原因 – 但是我再次敦促读者不要担心why错误的决定,因为看看java.util.Calendar和找到更好的东西
使用0为基础的索引is的一点是,它使得像“数组名称”更容易:

// I "know" there are 12 months
String[] monthNames = new String[12]; // and populate...
String name = monthNames[calendar.get(Calendar.MONTH)];

当然,一旦您获得了13个月的日历,就会失败…但至少指定的大小是您预期的月份数。
这不是good的原因,但它是a原因…
编辑:作为一个评论,请求一些关于我认为是日期/日历错误的想法:

  • 令人惊奇的基地(1900年作为日期的年底,毫无疑问是不建议的建设者; 0作为两个月的基数)
  • 可变性 – 使用不可变类型使much更简单地与真正有效的工作values
  • 类型不足:将DateCalendar作为不同的东西是很好的,
    但是缺少“本地”与“分区”值的分离,日期/时间与日期与时间相同
  • 一个使用魔术常数导致丑陋代码的API,而不是明确命名的方法
  • 一个很难理解的API – 关于什么时候重新计算的所有业务
  • 使用无参数构造函数默认为“now”,这将导致难以测试的代码
  • 始终使用系统本地时区的Date.toString()实现(在此之前混淆了许多Stack Overflow用户)

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why is January month 0 in Java Calendar?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

58 − = 50