关于这个问题有很多答案,但无论如何我将给出我的观点。
如前所述,这种奇怪行为背后的原因来自POSIX C time.h,其中月份存储在0-11范围内的int类型中。
要解释为什么,可以这样看;年和日在口语中被认为是数字,但月份有自己的名字。因为一月是第一个月,它将被存储为偏移量0,数组的第一个元素。monthname[JANUARY]将是"January"。一年中的第一个月是第一个月数组元素
因为语言写作比看起来要难得多,特别是处理时间比大多数人想象的要难得多。关于这个问题的一小部分(在现实中,不是Java),请参阅YouTube视频“时间问题”。Timezones - Computerphile" at https://www.youtube.com/watch?v=-5wpm-gesOY。如果你在困惑中笑掉了头,不要感到惊讶。