3

我正在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

4 回答 4

2

原因

根据joda-time文档,

2007-03-31 加一个月不能变成 2007-04-31,所以月份日期调整为 2007-04-30。

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

所以这不是错误,而是这些 API 的工作方式。

解决方案

示例应用程序中找到

使用 {{JODA_TODAY+6m}} 而不是 {{TODAY+6m}}

于 2016-09-08T13:29:23.540 回答
1

如果您从 2016 年 9 月 30 日开始,再加上五个月,您将得到 2017 年 2 月 30 日。

但是二月只有28天。

看起来 Jodatime 已经“四舍五入”为您提供该月的最大有效日期(即 2 月 28 日),而另一个库/代码将“2 月 30 日”视为 3 月 2 日(因为从技术上讲,这是 28 日之后的两天, 30 号也是)。

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

于 2016-09-08T06:33:35.577 回答
1

请参阅:DateTime::plusMonths(int)

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

计算将尽最大努力仅更改保留月份同一天的月份字段。但是,在某些情况下,可能需要更改较小的字段。例如,2007-03-31 加一个月不能得出 2007-04-31,因此将月份日期调整为 2007-04-30。

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

于 2016-09-08T12:39:45.810 回答
-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如何将一个月添加到日期并获得同一天

于 2016-09-08T09:08:46.140 回答