/**
* 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 任何人都可以帮忙??
答案 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对象中检索本地时间。