添加月份时出错日期

时间:2016-09-08 05:22:42

标签: java jodatime stubbydb

我正在StubbyDB写我的存根。并在功能测试中断言数据。这是我在功能测试中所做的事情,用于计算断言的日期(使用joda datetime库)

DateTime now = DateTime.now();
DateTime future = now.plusMonths(6);

这是我在存根中做的事情;

{{TODAY+6m}}

但是我得到了几天的差异。这是错误还是我做错了什么?

修改

今天考虑是" 2016年9月30日",然后我再添加5个月

now.plusMonths(5) => 2017-02-28
{{TODAY+5m}} => 2017-03-02

4 个答案:

答案 0 :(得分:2)

<强>原因

根据joda-time文档,

  2007-03-31加上一个月不能导致2007-04-31,所以当天   月份调整为2007-04-30。

然而,StubbyDB使用基于javascript的日期计算,将日期调整为2007-04-31至2007-05-01。

所以这不是错误,但这就是这些API的工作原理。

<强>解决方案

sample application

中找到

使用{{JODA_TODAY + 6m}}代替{{TODAY + 6m}}

答案 1 :(得分:1)

如果你从2016年9月30日开始,再加上五个月就会得到30/02/2017。

但二月只有28天。

看起来Jodatime已经&#34;四舍五入&#34;给你这个月的最长有效日期(即2月28日),而另一个图书馆/代码正在处理&#34; 2月30日&#34;截至3月2日(从技术上讲,这是28日过去的两天,也就是30日也是如此)。

两者都是处理日期恕我直言的有效假设,并且是一个很好的教训,为什么日期处理很难。您需要明确指出要遵循的约定,并且您可能必须编写断言以遵循Jodatime的惯例。

答案 2 :(得分:1)

请参阅:DateTime::plusMonths(int)

  

返回此日期时间的副本加上指定的月数。

     

计算将尽力只更改月份字段   保留当月的同一天。但是,在某些情况下,它   可能有必要改变较小的领域。例如,2007-03-31加   一个月不能导致2007-04-31,所以每月调整一天   到2007-04-30。

所以, 2016年9月30日 + 5个月= 2017年2月28日(根据Joda的逻辑)并且它不是错误

答案 3 :(得分:-1)

以下是将月份添加到指定日历日期的示例代码

public class Demo {

 // create a calendar
 Calendar cal = Calendar.getInstance()

// print current date
 System.out.println("The current date is : " + cal.getTime());

 // add 1 months from the calendar
 cal.add(Calendar.MONTH, 1);

}

FYR How to add one month to a date and get the same day