我知道有很多问题,但我找不到一个与我的情况相匹配的问题。我必须知道一个日期是否正好是x个月后的另一个日期。
对于ChonoUnit
,这是不可能的,因为2020/05/25
和2020/07/27
或2020/07/25
将返回相同的月数,而我无法处理天数的差异。我与JodaTime 有相同类型的响应
我试过Perdiod
,但它也不相关。
LocalDate localDate = LocalDate.of(2020,1,30);
LocalDate toTest = localDate.plusMonths(1L); // returns 2020/02/29
Period.between(localDate, toTest);
返回0个月,30天
我读到endDate是独占的,所以我尝试添加一天
LocalDate localDate = LocalDate.of(2020,1,30);
LocalDate toTest = localDate.plusMonths(1L); // returns 2020/02/29
Period.between(localDate, toTest.plusDays(1L));
返回第1个月、第1天
所以我的问题是:有没有一种方法可以获得与LocalDate处理月份的方式兼容的信息?
编辑
好吧,我的要求不够精确。我知道一个月不是绝对值,我对一个月的概念也无关紧要。
在我的情况下,我有一个LocalDate输入,我不能限制它。我必须每X个月减去Y天生成一次输出。
知道我在时间表中测试今天是否正好是我输入后的X个月减去Y天(准确地说,我测试两个日期之间的月数模X是否等于0(。但如果我的输入是本月31日,Period
将永远不会返回给我1 months, 0 days
。如果这是第30次,而我的产出应该在2月份触发,那么这两次都不会。
考虑到如果在短短的几个月里,输出发生在不存在的逻辑日期的前一天,这不是问题。
我给出的LocalDate示例只是从我的测试中提取的,但这是我感谢的方式,我可以做到这一点,因此不需要为自己做一个复杂的算法和许多条件。
我认为你在描述中尝试过一月和二月。这可能会造成问题。所以你必须手动处理这种情况。否则,您的代码将正常工作。
月份不是精确的时间单位。想想看:我们可以在1分钟、1小时、1天和1周内准确地说出有多少秒。但不同月份的秒数会有所不同。所以你需要定义逻辑,你认为两个日期相差一个月是什么?一旦你定义了所有预期的行为(包括从1月30日、2月28/29日或3月1日算起一个月的时间(,你就可以看到是否有任何开箱即用的东西对你有用,或者你需要实现自己的逻辑
我必须知道一个日期是否正好是x个月后的日期。
这是一个不明确的请求。一个显而易见的解释是:
int monthA = a.getYear() * 12 + a.getMonthValue();
int monthB = b.getYear() * 12 + b.getMonthValue();
// Months.between can probably also be used instead of this math.
return a.getDayOfMonth() == b.getDayOfMonth() && (monthA - monthB) == x;
但这确实意味着,3月30日"正好一个月后"的日期是不可能存在的:没有2月30日,也永远不会。
这是你真正想要的吗?考虑到一个月的长度取决于你问的是哪个月,"正好一个月后"不是一个明智的问题。因此:你到底是什么意思?
- 同月同日,X个月后?(意识到有很多日期不可能有这样的日期(
- X天后,其中X是基于我们所在月份的公式化方法
我可能还没有得到它。尽管如此,请给我一个机会,从评论中详细阐述我的想法:如果你喜欢LocalDate.plusMonths()
的方式,那么就用这个方法。
int monthsBetween = 3; // X
int daysBefore = 11; // Y
LocalDate originalDate = LocalDate.of(2020, Month.JANUARY, 30);
int nextTimeCount = 1; // next time to generate output will be the 1st time
LocalDate nextDate = originalDate.plusMonths(nextTimeCount * monthsBetween).minusDays(daysBefore);
LocalDate today = LocalDate.now(ZoneId.systemDefault());
while (! nextDate.isAfter(today)) {
System.out.format("Generating output no. %d for %s%n", nextTimeCount, nextDate);
nextTimeCount++;
nextDate = originalDate.plusMonths(nextTimeCount * monthsBetween).minusDays(daysBefore);
}
我刚刚运行时的输出(12月30日(:
Generating output no. 1 for 2020-04-19 Generating output no. 2 for 2020-07-19 Generating output no. 3 for 2020-10-19
假设你的程序在几个月内不会不间断地运行,你当然需要一些方法来保持数据。因此,我的代码将无法正常工作,但如果行为如预期,您可能会使用与我正在使用的相同的mthod调用。