使用Calendar类Java的意外行为

时间:2011-11-09 20:00:26

标签: java date java-7

我有以下代码来获取当前系统日期的不同部分(本案例为10-11-2011)。

Calendar now = Calendar.getInstance();
String dt = ""+now.get(now.DATE)+"-"+now.get(now.MONTH)+"-"+now.get(now.YEAR);

此处,DATEYEAR字段按预期显示值,但MONTH字段显示意外结果,首先我不知道MONTH字段从零开始,所以当前月份为11会给我10。现在,如果我使用now.get(now.MONTH+1)而不是返回46。仅使用now.MONTH代替get方法,只需2

那么,我在这里做错了什么?它不应该是Calendar类中的错误。

请注意,我使用的是JDK 7.

2 个答案:

答案 0 :(得分:5)

您需要now.get(Calendar.MONTH) + 1

now.get(Calendar.MONTH)返回从0开始的月份。您需要在结果中添加1。如果你执行now.get(Calendar.MONTH + 1),那么你得到的不是月份,因为你不再将MONTH常量传递给get方法。 get只需要一个int作为参数。恒定的MONTH意味着“我想得到这个月”。常数DATE表示“我想得到日期”。他们的价值毫无意义。 MONTH是2,3是WEEK_OF_YEAR。

另请注意,应使用类名访问静态变量(或常量),而不是类的实例。

您是否考虑过使用SimpleDateFormat?这是使用特定模式格式化Date的类:

new SimpleDateFormat("dd/MM/yyyy").format(now.getTime());

答案 1 :(得分:0)

根据Javadoc

对月份进行零索引
  

月份由0到11之间的整数表示; 0是1月,1是2月,依此类推;因此11月是12月。

,同样适用于Calendar

  

格里高利和朱利安日历中的第一个月是1月,即0;最后一个取决于一年中的月数。

您需要在其中添加1才能以数字方式显示它或使用java.text.SimpleDateFormat来自动执行此操作。

如果您在日期方面做了很多工作,那么我建议您使用Joda time。它比Java核心库日期/时间处理要好得多。

  

Joda-Time为Java日期和时间类提供了高质量的替代品。该设计允许多个日历系统,同时仍提供简单的API。默认情况下' calendar是XML使用的ISO8601标准。 Gregorian,Julian,Buddhist,Coptic,Ethiopic和Islamic系统也包括在内,我们欢迎进一步增加。支持类包括时区,持续时间,格式和解析。