【发布时间】:2015-01-22 06:43:35
【问题描述】:
我尝试使用 java DateTime 和方法 plusMonths() 从给定的开始日期添加整月。
当我的开始时间是月初时,一切正常:
DateTime startOfMonth = new DateTime(2013, 1, 1, 00, 00, 00);
System.out.println(startOfMonth.toString());
for (int i = 0; i < 12; i++) {
startOfMonth = startOfMonth.plusMonths(1);
System.out.println(startOfMonth.toString());
}
输出是每个月的第一天,一切都很好!
2013-01-01T00:00:00.000+01:00
2013-02-01T00:00:00.000+01:00
2013-03-01T00:00:00.000+01:00
2013-04-01T00:00:00.000+02:00
2013-05-01T00:00:00.000+02:00
2013-06-01T00:00:00.000+02:00
2013-07-01T00:00:00.000+02:00
2013-08-01T00:00:00.000+02:00
2013-09-01T00:00:00.000+02:00
2013-10-01T00:00:00.000+02:00
2013-11-01T00:00:00.000+01:00
2013-12-01T00:00:00.000+01:00
2014-01-01T00:00:00.000+01:00
但是当我将示例更改为月底时,它并没有返回我想要的!
System.out.println("");
DateTime endOfMonth = new DateTime(2012, 12, 31, 23, 59, 59);
System.out.println(endOfMonth.toString());
for (int i = 0; i < 12; i++) {
endOfMonth = endOfMonth.plusMonths(1);
System.out.println(endOfMonth.toString());
}
这会返回:
2012-12-31T23:59:59.000+01:00
2013-01-31T23:59:59.000+01:00
2013-02-28T23:59:59.000+01:00
2013-03-28T23:59:59.000+01:00
2013-04-28T23:59:59.000+02:00
2013-05-28T23:59:59.000+02:00
2013-06-28T23:59:59.000+02:00
2013-07-28T23:59:59.000+02:00
2013-08-28T23:59:59.000+02:00
2013-09-28T23:59:59.000+02:00
2013-10-28T23:59:59.000+01:00
2013-11-28T23:59:59.000+01:00
2013-12-28T23:59:59.000+01:00
那么,为什么"2013-02-28T23:59:59.000+01:00" 加上一个月不是"2013-03-31T23:59:59.000+01:00"?
这三天在哪里?
【问题讨论】:
-
可能你需要专门处理2月份的情况。正如下面的答案所暗示的,这就是 DateTime 的行为方式。
-
@mawia 很多月份都少于 31 天。
-
这里是获取当月最后一天的正确方法:stackoverflow.com/questions/9711454/…
-
@Gatschet 你想要什么行为?您看到的行为是文档所承诺的方法 plusMonths()。
-
现在我看到了我的问题。如果我在 2 月 28 日与某人交谈,我们将在一个月后见到我们,我指的是 3 月 28 日!不是 3 月 31 日....