如果上个月的结束日期是2018年8月31日,我想获得最近三个月的月结束日期,即2018年6月30日,但是我使用CalendarUtil.addMonthsToDate()和JsDate的setMonth()两者都给我日期作为API 2018年7月1日。有关更多详细信息,请参见以下代码:
@babel/polyfill
谁能建议我同样的解决方案。因此,无论月份是31还是30天,我都会得到确切的日期。
PS:我不能在GWT客户端代码中使用java.util.Calendar。
答案 0 :(得分:2)
您非常接近所需的结果:)
您找到了跳到月末的正确方法:setToFirstDayOfMonth
,然后addDaysToDate
(-1天)将您带到上个月的最后一天。
如果查看addMonthsToDate
方法的实现,您会发现它不检查给定月份中有多少天。因此,您可以获得诸如Feb 30th
或Jun 31st
之类的无效日期。当然,这些日期将自动固定分别为Mar 2nd
和Jul 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
对任何月份都有效。