当前位置: 首页 > 面试题库 >

设置Java日历的值不能提供预期的日期时间

孟沛
2023-03-14
问题内容

我有一个小时,分钟,日期和毫秒时间戳,并且正在尝试创建一个表示时间的Date对象。时间戳记是美国东部夏令时。

在剖析问题时,我创建了一些简单的测试代码以查看发生了什么,并观察到以下内容:

    Date today = new Date();
    int hour = 4, min  = 0, sec  = 0, ms   = 64;
    boolean print = true;

    Calendar cal = GregorianCalendar.getInstance();
    if(print)
        System.out.println("After initializing, time is: "+cal.getTime());
    cal.clear();
    if(print)
        System.out.println("After clearing, time is: "+cal.getTime());
    cal.setTime(today);
    if(print)
        System.out.println("After setting date, time is: "+cal.getTime());
    cal.set(Calendar.HOUR_OF_DAY,hour);
    if(print)
        System.out.println("After setting hour, time is: "+cal.getTime());
    cal.set(Calendar.MINUTE,min);
    if(print)
        System.out.println("After setting minute, time is: "+cal.getTime());
    cal.set(Calendar.SECOND,sec);
    if(print)
        System.out.println("After setting second, time is: "+cal.getTime());
    cal.set(Calendar.MILLISECOND,ms);
    if(print)
        System.out.println("After setting milliseconds, time is: "+cal.getTime());
    cal.setTimeZone(TimeZone.getTimeZone("EDT"));

    System.out.println("After setting time zone, time is: "+cal.getTime());

产生输出:

After initializing, time is: Tue Jan 07 16:01:59 EST 2014
After clearing, time is: Thu Jan 01 00:00:00 EST 1970
After setting date, time is: Tue Jan 07 16:01:59 EST 2014
After setting hour, time is: Tue Jan 07 04:01:59 EST 2014
After setting minute, time is: Tue Jan 07 04:00:59 EST 2014
After setting second, time is: Tue Jan 07 04:00:00 EST 2014
After setting milliseconds, time is: Tue Jan 07 04:00:00 EST 2014
After setting time zone, time is: Tue Jan 07 04:00:00 EST 2014

但是,如果我稍微更改代码:

boolean print = false;

我得到以下(不同)结果(!)

After setting time zone, time is: Mon Jan 06 23:00:00 EST 2014

有人知道为什么会这样吗?


问题答案:

您需要先设置时区。请参阅下面的GregorianCalendar.setTimeZone的定义:

public void setTimeZone(TimeZone value)
{
    zone = value;
    sharedZone = false;
    /* Recompute the fields from the time using the new zone.  This also
     * works if isTimeSet is false (after a call to set()).  In that case
     * the time will be computed from the fields using the new zone, then
     * the fields will get recomputed from that.  Consider the sequence of
     * calls: cal.setTimeZone(EST); cal.set(HOUR, 1); cal.setTimeZone(PST).
     * Is cal set to 1 o'clock EST or 1 o'clock PST?  Answer: PST.  More
     * generally, a call to setTimeZone() affects calls to set() BEFORE AND
     * AFTER it up to the next call to complete().
     */
    areAllFieldsSet = areFieldsSet = false;
}


 类似资料:
  • 问题内容: 我在JUnit测试中有以下代码,该代码上周似乎正常工作,但本周失败了: 您可能会从我的评论中推断出,由于12日是星期二,因此我希望将DAY_OF_WEEK设置为星期五后,日期将为15。但是,打印的值为22,并导致测试失败。 但是,如果我将代码更改如下,并添加另一个调用以获取: 我得到预期的输出12和15。 有人可以解释发生了什么,为什么上周该测试仍然有效? 问题答案: 首先要了解的是,

  • 当创建日历对象并使用SimpleDataFormat解析字符串来设置日期/时间时,是否可以在两行单独的代码中设置日期和时间?例如,在我的SQLite数据库中,日期(mm-dd-yyy)与时间(hh:mm)存储在一个单独的列中。做以下事情是否符合犹太教 第二个是卡尔。setTime line是否将日历对象的日期部分重置为现在,然后只更改时间?

  • 问题内容: 我有一个电影课,里面有开始日期,持续时间和结束日期。开始和停止日期是日期对象(私有日期startDate …)(这是一个分配,因此我无法更改),现在我想通过将持续时间(以分钟为单位)添加到startDate中来自动计算stopDate。 据我所知,不赞成使用Date的时间操作功能,因此是不好的做法,但另一方面,我看不到将Date对象转换为日历对象以操纵时间并将其重新转换为Date对象的

  • 但以下内容: 只是管用。 日期的大小写相同。

  • 例如,我有30个用户,我想为每个人设置随机start_day和随机end_day的假期。我想使用日期,而不是LocalDate。如果我必须使用LocalDate,这就是答案。 我想用Date来做这件事,因为在JSON的Date格式中,带“Date”的是“yyyy/mm/dd”,另一方面,如果我使用LocalDate,JSON中的格式是这样的

  • 我正在寻找确切的开始和结束日期根据我们的桌面日历,如果我给周,年作为输入。但是上面的代码给出的输出是2009年1月27日星期日。我知道这是因为按照我们的说法,一周的第一天默认是星期天,但我需要按照桌面日历