Java Calendar对象检索错误的日期?

时间:2011-02-23 06:11:56

标签: java calendar

/**
 * Gets an instance of GMT Calendar.
 *
 * @return a new <code>Calendar</code> object
 */
public static Calendar getGMTCalendar()
{
    return Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
}

/**
 * @return The month (eg. Calenday.MAY) value for the date.
 */
public static int getMonth(Date date)
{
    Calendar c = getGMTCalendar();
    System.out.println("date ::"+date.toString());
    c.setTime(date);
    int month=c.get(Calendar.MONTH);
    System.out.println("date after calendar is set ::"+c.getTime()+",Month="+month);
    return c.get(Calendar.MONTH);
}

上面是我正在使用的代码。当我尝试检索我传递给getMonth()的日期的月份时

int month = DateUtil.getMonth(date); (日期是10-01-2010)

我期待的月份是8(1月1日,1月2日... 8月9日,9月10日),但我得到的是 一个月= 8。 我尝试调试,发现在函数getMonth()中我设置时间使用 c.setTime(日期)日期设定为09-31-2010,即日期过去前一天。 我使用INtellij Idea作为Ide  任何人都可以帮忙??

2 个答案:

答案 0 :(得分:3)

好的,现在我们已经将真正的数据输出了,问题在于您的初始日期。

就我个人而言,我发现使用Joda Time诊断此类事情最容易:

import org.joda.time.*;

public class Test {

    public static void main(String[] args)
    {
        DateTime dt = new DateTime(1285871400000L,
                                   DateTimeZone.UTC);
        System.out.println(dt);
    }
}

这肯定会显示UTC中的所有内容......并打印2010-09-30T18:30:00.000Z。所以你传递到日历的那一刻是9月,而不是10月。它为您提供的数据提供了正确的结果,因为您已经指定了GMT时区 - 您只是没有提供您认为的数据。

您需要了解Date只是及时代表即时,而不参考日历系统或时区。因此,由于您的默认时区,该日期值将于10月1日打印出 ,但它仍然是ISO日历中9月30日晚的UTC时刻。

说实话,如果您可以使用Joda Time而不是内置日历类型,那么您应该......但是当您不知道时,您仍需要小心应用的系统默认时区我想要它。

答案 1 :(得分:0)

如果您在具有负偏移的时区(例如,美国)并将GMT日期设置为时间00:00:00的一个月的第一天,则当地时间将在之前一天(和上个月)。检查以确保您没有从Calendar对象中检索本地时间。