Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日历对象检索错误的日期?_Java_Calendar - Fatal编程技术网

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

Java日历对象检索错误的日期?,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,

上面是我正在使用的截取代码

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,则本地时间将位于前一天(和前一个月)。检查以确保您没有从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);
    }
}