当前位置: 首页 > 面试题库 >

为什么1月在Java日历中为0?

杜俊逸
2023-03-14
问题内容

在中java.util.Calendar,将1月定义为第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个月的日历,此操作就会失败…但是至少指定的大小是你期望的月数。

这不是一个很好的理由,但这是一个理由…

编辑:作为一种评论,它要求我对Date / Calendar错误的一些想法:

  • 令人惊讶的基数(Date中的1900作为Date中的年基,已弃用的构造函数必不可少;两者均为月基)
  • 可变性-使用不变类型使得很多简单的什么是真正有效的工作值
  • 类型集不足:拥有DateCalendar作为其他事物很好,但是缺少“本地”值与“分区”值的分隔,日期/时间与日期对时间也是如此
  • 一个使用魔术常数导致丑陋代码的API,而不是使用明确命名的方法
  • 很难推理的API-有关何时重新计算事物的所有事务等
  • 使用无参数的构造函数默认为“ now”,这导致难以测试的代码
  • Date.toString()它总是使用系统本地时区(即现在来迷惑许多堆栈溢出用户之前)执行


 类似资料:
  • 问题内容: 运行下面的代码结果为0? 问题答案: 两个操作数(1和3)是整数,因此使用整数算术(此处为除法)。将结果变量声明为double只会导致除法后发生隐式转换。 当然,整数除法会返回除法四舍五入的真实结果。因此,0.333…此处的结果四舍五入为0。(请注意,处理器实际上不进行任何舍入,但是您仍然可以这样考虑。) 另外,请注意,如果两个操作数(数字)均以浮点数给出;3.0和1.0,甚至只是第一

  • 问题内容: 使用date(1970年1月1日)作为时间操纵的默认标准有什么原因吗?我已经在Java和Python中看到了这个标准。我知道这两种语言。还有其他遵循相同标准的流行语言吗? 请描述。 问题答案: 这是Unix时间的标准。 Unix时间或POSIX时间是一种用于描述时间点的系统,时间点定义为自1970年1月1日午夜多点协调世界时(UTC)起经过的秒数,不包括leap秒。

  • 问题内容: 我正在使用以下代码 输出是 添加到 一月 是给 月 月。如果我们在当前日期加上30天,则可能返回正确的输出。但我想显示 2 月。有人可以帮我吗.. 问题答案: 您可以看到+1设置字段添加的日期与您的日期不同(从输出中观察到)。 如果你想几个月,那么使用代码

  • 我得根据年、月、日、时、分来数次数。(秒统一为零,我不需要秒) 我选择了HashMap作为数据结构。 我没有用“约会”。是因为,Android Devloper这样说。 日期(int year,int month,int Date,int hrs,int min,int sec)API级别1中不推荐使用此构造函数。从JDK 1.1版开始,由calendar.set(年+1900,month,dat

  • 问题内容: 例如: 版画1 乔达时间也是如此。 问题答案: Year of Year的定义是依赖的。 其他帖子中讨论了在美国如何定义。例如在德国(DIN 1355-1 / ISO 8601):一年的第一周*是新年中具有四天或以上的第一周。 *一周的第一天是星期一,一周的最后一天是星期日 JavaCalendar注重语言环境。例如: 印刷品: 添加 对于美国(我认为墨西哥也是如此),每年的1.星期是