Java日历对象检索错误的日期?
上面是我正在使用的截取代码 int month=DateUtil.getMonth(日期);(日期为2010年1月10日) 我期待的月份是8(1月0日,2月1日…9月8日,10月9日),但我得到的是 月份=8。 我尝试过调试,发现在函数getMonth()中使用 c、 设置时间(日期)日期设置为2010年9月31日,即日期过去前一天。 我使用INtellij Idea作为IdeJava日历对象检索错误的日期?,java,calendar,Java,Calendar,上面是我正在使用的截取代码 int month=DateUtil.getMonth(日期);(日期为2010年1月10日) 我期待的月份是8(1月0日,2月1日…9月8日,10月9日),但我得到的是 月份=8。 我尝试过调试,发现在函数getMonth()中使用 c、 设置时间(日期)日期设置为2010年9月31日,即日期过去前一天。 我使用INtellij Idea作为Ide 有人能帮忙吗???如果您所在的时区偏移量为负(例如美国),并将GMT日期设置为一个月的第一天,时间为00:00:00,
有人能帮忙吗???如果您所在的时区偏移量为负(例如美国),并将GMT日期设置为一个月的第一天,时间为00:00:00,则本地时间将位于前一天(和前一个月)。检查以确保您没有从Calendar对象检索本地时间。好的,现在我们已经获得了真实数据,问题在于您的初始日期 就我个人而言,我发现使用Joda Time诊断这类事情最容易:
/**
* 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);
}
这肯定会显示UTC中的所有内容。。。它会打印2010-09-30T18:30:00.000Z。所以你进入日历的时间是在九月,而不是十月。它为您提供的数据提供了正确的结果,因为您指定了GMT时区-您只是没有提供您认为是的数据
您需要了解,Date
只表示时间上的一个瞬间,不涉及日历系统或时区。因此,虽然由于默认时区的原因,该日期值在10月1日打印出来,但实际上它仍然是ISO日历中UTC的9月30日晚上的一个瞬间
老实说,如果您可以使用而不是内置的日历类型,您应该。。。但是,当您不希望应用系统默认时区时,仍然需要小心 根据从
date.getTime()返回的内容,date
的确切值是多少?我怀疑这会回答一切…@Jon Skeet:我修改了代码来打印日期和月份,这就是我得到的。日期::Fri Oct 01 00:00:00 GMT+05:30 2010日历设置后的日期::Fri Oct 01 00:00:00 GMT+05:30 2010,Month=8。这次Month应该等于9。只是不明白为什么会发生这种情况。我询问了调用date.getTime()
的结果,因为这给出了基础数据。你也改变了主意,决定是9月还是10月…@Jon Skeet:先生,这是2010年10月1日date.getTime()的结果,date::1285871400000。非常感谢。那不是2010年10月1日。九月三十日。看看我的答案。@Jon非常感谢。那么,是系统默认时区造成了问题吗?相同的程序在其他机器上运行良好。可能的解决方案是什么??许多的thanks@mglauche那么,到目前为止,在这种情况下,我将无法使用Joda time。代码在其他机器上运行良好,并且已经部署。非常感谢-@wantobegeek:部署了什么-出现错误的日期
值的代码?呃…@Jon先生,如果代码有问题,为什么它不会在其他机器上引起任何问题?
import org.joda.time.*;
public class Test {
public static void main(String[] args)
{
DateTime dt = new DateTime(1285871400000L,
DateTimeZone.UTC);
System.out.println(dt);
}
}