Java最后一天的问题

MyN*_*ero 7 java android calendar date

我正在尝试创建一个涵盖整整一个月的日期范围,即

[开始日期; 结束日期]

因此,我有一个参考日期,并尝试从中创建一个新的日期.我对"endDate"有疑问,因为我希望它接近一天结束时(即23:59:59).

我正在使用的代码如下:

  public static Date previousMonthLastDate(Date referenceDate) {
    Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
    calendar.setTime(referenceDate);
    calendar.add(Calendar.MONTH, -1); // move to the previous month
    int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    calendar.set(Calendar.DAY_OF_MONTH, lastDay);
    // set the time to be the end of the day
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);

    return calendar.getTime();
  }
Run Code Online (Sandbox Code Playgroud)

此代码在Android 模拟器上按预期工作.但是,在真实手机上运行它会给出错误的日期.因此,我认为这是某种时区问题.

在电话上,而不是说2010年8月31日,它给出了2010年9月1日.此值接缝将在将HOUR_OF_DAY设置为23的代码行之后设置.

有任何想法吗?

谢谢.

wax*_*ing 6

我无法回答为什么会发生这种情况,但您是否尝试将其设置为下个月的第一天并减去一秒/毫秒?

calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.add(Calendar.MILLISECOND, -1);
Run Code Online (Sandbox Code Playgroud)


Edu*_*omo 6

我在做类似的事情:

使用此代码,我在间隔中设置日期:

Date day = new Date()
Run Code Online (Sandbox Code Playgroud)

使用此代码,我得到间隔:

Calendar startDate = Calendar.getInstance();
Calendar endDate = Calendar.getInstance();

// Set time
startDate.setTime(day);
endDate.setTime(day);

startDate.set(Calendar.DAY_OF_MONTH, 1);
startDate.set(Calendar.HOUR_OF_DAY, 0);
startDate.set(Calendar.MINUTE, 0);
startDate.set(Calendar.SECOND, 0);
startDate.set(Calendar.MILLISECOND, 0);

endDate.set(Calendar.DAY_OF_MONTH, endDate.getActualMaximum(Calendar.DAY_OF_MONTH));
endDate.set(Calendar.HOUR_OF_DAY, 23);
endDate.set(Calendar.MINUTE, 59);
endDate.set(Calendar.SECOND, 59);
Run Code Online (Sandbox Code Playgroud)


Dam*_*ien 3

如果您希望时区取决于手机设置,则不应在创建日历时强制使用时区。只需使用:

Calendar calendar = Calendar.getInstance();
Run Code Online (Sandbox Code Playgroud)