Java 这是二月还是三月?校准集(2010年1月10日)

Java 这是二月还是三月?校准集(2010年1月10日),java,date,calendar,Java,Date,Calendar,我已在我的应用程序中设置了此日历: Calendar cal = Calendar.getInstance(); cal.set(2010, 1, 10); 我使用这个SimpleDateFormat将月份作为一个单词: SimpleDateFormat formatMonth = new SimpleDateFormat("MM"); 在一节课上,它的名字是2010年2月10日 在另一部电影中,它的名字是2010年3月10日 哪一个是正确的?的month参数以零为基础,因此1表示二月。第

我已在我的应用程序中设置了此日历:

Calendar cal = Calendar.getInstance();
cal.set(2010, 1, 10); 
我使用这个
SimpleDateFormat
将月份作为一个单词:

SimpleDateFormat formatMonth = new SimpleDateFormat("MM");
在一节课上,它的名字是2010年2月10日

在另一部电影中,它的名字是2010年3月10日


哪一个是正确的?

month
参数以零为基础,因此
1
表示
二月
。第一种行为是正确的


我怀疑您的另一个类中的某些内容错误地试图补偿以零为基础的月份索引,这导致了一个错误。

考虑到与JDK日期处理相关的所有麻烦,您应该认真考虑。上述代码将重写为

DateTime dt = new DateTime().withDate(2010,2,10).withTime(12,13,14,0);
代表2010年2月10日UTC时间12:13:14.000。无歧义、线程安全且不可变


您应该注意,SimpleDataFormat不是线程安全的。

calendar类具有数月的常量

 Calendar.JANUARY

比如说。您应该使用它们。

如果SimpleDataFormat不是线程安全的,为什么这很重要?例如,这在哪里会导致问题?只有当您将其声明为静态变量或实例变量以便在不同线程之间使用时,才会导致问题。如果你宣布它是本地的就安全了。然而,这与您的实际问题没有多大关系。@kors正如BalusC正确指出的那样,如果您每次都在一个方法中创建一个新实例,则可以使用SimpleDataFormat。大多数人不会这样做,而是依赖于外部静态助手,这会导致多个线程更改其内部状态,并且在应用程序加载时解析和格式化日期时会得到错误的结果。这是一个您以后可能会遇到的问题,因此我将为您预先解决一个未来的问题,并尝试引导您找到更好的总体解决方案。