Java 日期格式化程序未正确格式化日期

Java 日期格式化程序未正确格式化日期,java,datetime,date,simpledateformat,Java,Datetime,Date,Simpledateformat,我编写了以下java代码,以特定格式格式化日期和时间。您可以在上看到以下代码 } 它给了我以下输出: 2009/08/01 15:20:00 在这个输出中,除了一个月之外,一切都很好。我一个月通过了7,但在这个问题上,它的输出是8。请告诉我哪里做错了。我对java的日期/日历类不是很熟悉,所以请耐心听我说。月份是以0为基础的,您通过了7,因此解析为8月份 从java.util.Date的api文档: 一个月由0到11的整数表示;0是一月,1是二月,依此类推;因此,11月是12月 将月份设为零是

我编写了以下java代码,以特定格式格式化日期和时间。您可以在上看到以下代码

}

它给了我以下输出:

2009/08/01
15:20:00

在这个输出中,除了一个月之外,一切都很好。我一个月通过了7,但在这个问题上,它的输出是8。请告诉我哪里做错了。我对java的日期/日历类不是很熟悉,所以请耐心听我说。

月份是以0为基础的,您通过了7,因此解析为8月份

从java.util.Date的api文档:

一个月由0到11的整数表示;0是一月,1是二月,依此类推;因此,11月是12月


将月份设为零是违反直觉的。我想我们在某个时候都会被这个问题所困扰。

Java中的月份字段是以零为基础的。一月是0…等等。 因此,如果要将日期传递到构造函数中,请在月值中添加一个日期

如果您查看[JavaDoc here][1],它会为您解释这一点


[1] :,int,int)

人类喜欢看到第一个月(一月)是1,所以这就是
SimpleDateFormat
所做的


然而,计算机喜欢从0开始观察事物,这就是
gregoriacalendar
管理
month
参数的方式。请参见
month
参数的名称和说明。

[Java考虑一月-月0.][1]但当您使用SimpleDateFormat输出月号时,它使用标准的一月-月1系统。所以第7个月被输出为8

如果您对JDK的日期和日历有问题考虑使用,则更容易


[1] :,int,int)

这是真的,但它令人困惑,因为月份字段是唯一以零为基础的字段。是的,我同意!我想,我们已经习惯了从零开始计算的各种事情,但几个月以来,几乎都是从零开始的。我认为他们在设计那个课程时做了错误的决定。不管怎么说,事情就是这样,我们对此无能为力:(啊……有人知道它背后的具体原因吗,因为天是1-31。在日期/时间元素中,只有一天从1开始,其余的都是从零开始的,所以更具体的问题可能是,为什么他们不设计从0-30开始的天:)?您可以使用内置常量,如
Calendar.AUGUST
,以避免此问题。@Anil:是的,月份是唯一一个以0为基础的字段。在数天和数年中,数字是唯一的参考,因此从数字中减去一是非常糟糕的,因为月份主要是通过名字来知道的(不管怎样,用英语,而不是像日语这样的一些语言),他们觉得更自由地改变数字。不过,这是个糟糕的决定。
2009/08/01
15:20:00