CalendarUtil.addMonthsToDate()和JsDate.setMonth()在GWT中给出错误的日期

时间:2018-09-05 08:38:48

标签: gwt

如果上个月的结束日期是2018年8月31日,我想获得最近三个月的月结束日期,即2018年6月30日,但是我使用CalendarUtil.addMonthsToDate()和JsDate的setMonth()两者都给我日期作为API 2018年7月1日。有关更多详细信息,请参见以下代码:

@babel/polyfill

谁能建议我同样的解决方案。因此,无论月份是31还是30天,我都会得到确切的日期。

PS:我不能在GWT客户端代码中使用java.util.Calendar。

1 个答案:

答案 0 :(得分:2)

您非常接近所需的结果:)

您找到了跳到月末的正确方法:setToFirstDayOfMonth,然后addDaysToDate(-1天)将您带到上个月的最后一天。

如果查看addMonthsToDate方法的实现,您会发现它不检查给定月份中有多少天。因此,您可以获得诸如Feb 30thJun 31st之类的无效日期。当然,这些日期将自动固定分别为Mar 2ndJul 1st

因此,在这种情况下,您不能使用addMonthsToDate方法。但是您已经知道如何获取上个月的最后一天-只需再使用两次即可获得lastThreeMonthEndDate

Date currentMonthFirstDate = new Date();
CalendarUtil.setToFirstDayOfMonth(currentMonthFirstDate);   //1st Sep

//Setting the Last month end date
final Date lastMonthEndDate = CalendarUtil.copyDate(currentMonthFirstDate);
CalendarUtil.addDaysToDate(lastMonthEndDate, -1);           //31st Aug

final Date lastThreeMonthEndDate = CalendarUtil.copyDate(lastMonthEndDate);
CalendarUtil.setToFirstDayOfMonth(lastThreeMonthEndDate);   //1st Aug
CalendarUtil.addDaysToDate(lastThreeMonthEndDate, -1);      //31st Jul
CalendarUtil.setToFirstDayOfMonth(lastThreeMonthEndDate);   //1st Jul
CalendarUtil.addDaysToDate(lastThreeMonthEndDate, -1);      //30th Jun

请考虑:只要您先addMonthsToDate,就可以安全地使用setToFirstDayOfMonth方法。这样,您将不会获得无效日期,因为日期1st对任何月份都有效。