日期计算错误

时间:2018-03-02 08:39:13

标签: javascript

我有以下计算:

Stream<T> stream;
T last = Streams.findLast(stream);

2018年3月2日(今天),上述所有计算均正常。 但是,在2018年3月1日,最后三次计算出错了。 下面显示了上述两个日期的计算结果:

- 2018年3月2日(今天)

  

Thu Mar 01 2018 12:03:34 GMT + 0530(India Standard Time)**** 01-Mar-2018

     

Tue Jan 30 2018 12:03:34 GMT + 0530(India Standard Time)**** 30-Jan-2018

     

Thu Mar 01 2018 12:03:34 GMT + 0530(India Standard Time)**** 01-Mar-2018

     

2018年1月29日星期一12:03:34 GMT + 0530(印度标准时间)**** 29-Jan-2018

- 2018年3月1日(昨天)

  

2018年2月28日星期三12:12:32 GMT + 0530(印度标准时间)**** 28-Feb-2018

     

2018年2月26日星期一12:12:32 GMT + 0530(印度标准时间)****而非29-jan-2018

     

2018年3月28日星期三12:12:32 GMT + 0530(印度标准时间)**** 28-Feb-2018

     

Sun Feb 25 2018 12:12:32 GMT + 0530(印度标准时间)**** 28-jan-2018

1 个答案:

答案 0 :(得分:0)

嗯....查找。从documentation我们现在关于.setDate(..)下一步:

  

如果dayValue超出了月份的日期值范围,setDate()将相应地更新Date对象。例如,如果为dayValue提供了0,则日期将设置为上个月的最后一天。

让我们了解您的日期在3月1日会发生什么。

  

vCurrDate.setDate(vCurrDate.getDate() - 1);

根据setDate规范

将vCurrDate分配到2月28日之后
  

vDueFromDate.setDate(vCurrDate.getDate() - 30);

要vDueFromDate,您可以将日期设置为28-30或从当前日期开始的-2天。 0表示前几个月的最后一天,因此-2表示2月26日

  

vDueToDate.setDate(vCurrDate.getDate());

如上所述vCurrDate.getDate()现在是28,所以我们将vDueToDate设置为当月的28日,即3月28日。

  

vOverDueToDate.setDate(vCurrDate.getDate() - 31);

在这种情况下,您尝试将日期设置为当月的-3,因此,如上所述,这是2月25日