gpt4 book ai didi

java - 为什么 Java 日历中的一月是 0?

转载 作者:行者123 更新时间:2023-11-30 17:51:26 25 4
gpt4 key购买 nike

java.util.Calendar 中,一月被定义为月份 0,而不是月份 1。这有什么具体原因吗?

我看到很多人对此感到困惑......

最佳答案

这只是 Java 日期/时间 API 的可怕困惑的一部分。列出它的问题需要很长时间(而且我确信我不知道一半的问题)。诚然,处理日期和时间很棘手,但无论如何。

帮自己一个忙,使用 Joda Time相反,或者可能 JSR-310 .

编辑:至于原因 - 正如其他答案中所述,很可能是由于旧的 C API,或者只是一种从 0 开始的一般感觉......当然,除了日子从 1 开始。我怀疑原始实现团队之外的任何人是否能够真正说出原因 - 但我再次敦促读者不要太担心为什么做出错误的决定,而是要看看整个肮脏的领域在 java.util.Calendar 中找到更好的东西。

赞成使用基于 0 的索引的一点是,它使“名称数组”之类的事情变得更容易:

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

当然,一旦您获得包含 13 个月的日历,此操作就会失败...但至少指定的大小是您期望的月数。

这不是一个理由,但它是一个理由......

编辑:作为评论,要求提供一些关于我认为日期/日历有问题的想法:

  • 令人惊讶的基数(1900 作为 Date 中的年份基数,不可否认,对于已弃用的构造函数;0 作为两者的月份基数)
  • 可变性 - 使用不可变类型可以让使用真正有效的变得更加简单
  • 类型集不足:将 DateCalendar 作为不同的东西很好,但是缺少“本地”与“分区”值的分离,就像日期/时间与日期与时间的分离一样
  • API 会导致使用神奇常量的丑陋代码,而不是明确命名的方法
  • 一个很难推理的 API - 有关何时重新计算等的所有业务
  • 使用无参数构造函数默认为“now”,这会导致代码难以测试
  • Date.toString() 实现始终使用系统本地时区(之前这让许多 Stack Overflow 用户感到困惑)

关于java - 为什么 Java 日历中的一月是 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16752111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com