Java Calendar.set没有给出正确的结果

时间:2009-07-20 10:47:40

标签: java date calendar

我无法看到下面的代码我出错了,它可能是显而易见的但我现在太盲目了,无法看到它。我将“01/01/2009”的日期传递给日历实例。然后我尝试将月份设置为3月份,我看到的输出是

格式:01/01/2009

cal月:2

cal.set( Calendar.MONTH, mth ); //mth = int 2

log.debug("formatted: " + formatter.format(cal.getTime()));
log.debug("cal month: "+Integer.valueOf(cal.get(Calendar.MONTH)).toString());

当我将Calendar.DAY设置为最大值时,日期显示为 31/01/2009

为什么我的月份设置没有?

3 个答案:

答案 0 :(得分:7)

我们碰到了这个,结果是你设置的值在你真正尝试从日历中“获取”值之前不会被使用。我们感到困惑,因为使用调试器的值似乎永远不会被设置,但是当你真正“得到”它时,它就可以工作。

http://download.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html

获取和设置日历字段值

可以通过调用set方法来设置日历字段值。在需要计算其时间值(Epoch的毫秒数)或日历字段的值之前,不会解释日历中设置的任何字段值。调用get,getTimeInMillis,getTime,add和roll涉及这样的计算。

答案 1 :(得分:2)

我会仔细研究发生了什么,但一般的经验法则是:不要使用java.util。{Date,Calendar} 。使用Joda Time代替......它是所以更干净......

编辑:我目前无法重现您的问题。我仍然建议使用Joda,但是如果您可以发布一个简短但完整的程序来演示问题,我们可能会弄清楚出了什么问题。

编辑:基于另一条评论,我想知道你的格式化程序是否错误......你真的使用“dd / mm / yyyy”而不是“dd / MM / yyyy”吗? “mm”表示分钟,而不是数月。

答案 2 :(得分:0)

也许你想使用Calendar.DAY_OF_MONTH