当我添加月份时得到错误的日期
Getting wrong date when I add months
我正在 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
如果您从 2016 年 9 月 30 日开始,加上五个月,您将得到 2017 年 2 月 30 日。
但是2月只有28天
看起来 Jodatime "rounded down" 可以为您提供当月的最大有效日期(即 2 月 28 日),而另一个 library/code 将“2 月 30 日”视为 3 月 2 日(因为那从技术上讲是 28 日过去两天,也就是 30 日。
恕我直言,这两个都是处理日期的有效假设,并且是一个很好的教训,说明为什么日期处理很困难。您需要明确说明要遵循哪个约定,并且可能必须编写断言代码以遵循 Jodatime 的约定。
这是将月份添加到给定日历日期的示例代码
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);
}
财政年度 How to add one month to a date and get the same day
Returns a copy of this datetime plus the specified number of months.
The calculation will do its best to only change the month field
retaining the same day of month. However, in certain circumstances, it
may be necessary to alter smaller fields. For example, 2007-03-31 plus
one month cannot result in 2007-04-31, so the day of month is adjusted
to 2007-04-30.
所以,2016 年 9 月 30 日 + 5 个月 = 2017 年 2 月 28 日(根据 Joda 的逻辑),这不是错误
原因
根据 joda-time 文档,
2007-03-31 plus one month cannot result in 2007-04-31, so the day of
month is adjusted to 2007-04-30.
但是 StubbyDB 使用基于 javascript 的日期计算,将日期 2007-04-31 调整为 2007-05-01。
所以这不是错误,但这就是这些 API 的工作方式。
解决方案
使用 {{JODA_TODAY+6m}} 代替 {{TODAY+6m}}
我正在 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
如果您从 2016 年 9 月 30 日开始,加上五个月,您将得到 2017 年 2 月 30 日。
但是2月只有28天
看起来 Jodatime "rounded down" 可以为您提供当月的最大有效日期(即 2 月 28 日),而另一个 library/code 将“2 月 30 日”视为 3 月 2 日(因为那从技术上讲是 28 日过去两天,也就是 30 日。
恕我直言,这两个都是处理日期的有效假设,并且是一个很好的教训,说明为什么日期处理很困难。您需要明确说明要遵循哪个约定,并且可能必须编写断言代码以遵循 Jodatime 的约定。
这是将月份添加到给定日历日期的示例代码
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);
}
财政年度 How to add one month to a date and get the same day
Returns a copy of this datetime plus the specified number of months.
The calculation will do its best to only change the month field retaining the same day of month. However, in certain circumstances, it may be necessary to alter smaller fields. For example, 2007-03-31 plus one month cannot result in 2007-04-31, so the day of month is adjusted to 2007-04-30.
所以,2016 年 9 月 30 日 + 5 个月 = 2017 年 2 月 28 日(根据 Joda 的逻辑),这不是错误
原因
根据 joda-time 文档,
2007-03-31 plus one month cannot result in 2007-04-31, so the day of month is adjusted to 2007-04-30.
但是 StubbyDB 使用基于 javascript 的日期计算,将日期 2007-04-31 调整为 2007-05-01。
所以这不是错误,但这就是这些 API 的工作方式。
解决方案
使用 {{JODA_TODAY+6m}} 代替 {{TODAY+6m}}