我知道这方面有很多问题,但我找不到一个和我的案子相符的。我必须知道一个日期是否正好是一个又一个的x个月。
与 ChonoUnit
这是不可能的因为 2020/05/25
以及 2020/07/27
或者 2020/07/25
将返回相同的月数,我无法处理天数的差异。我对jodatime也有同样的React
我试过了 Perdiod
而且也不相关。
LocalDate localDate = LocalDate.of(2020,1,30);
LocalDate toTest = localDate.plusMonths(1L); // returns 2020/02/29
Period.between(localDate, toTest);
返回0个月,30天
我读到结束日期是排他性的,所以我试着加上一天
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月份触发,那永远都不会是30号。
如果在短短的几个月里,输出发生在非即时逻辑日期的前一天,这不是问题。
我给出的localdate的例子只是从我的测试中提取出来的,但是我感谢我可以这样做,这样就不用自己做一个有很多条件的复杂算法了。
4条答案
按热度按时间vsnjm48y1#
我可能还没拿到。尽管如此,请允许我试一下,从评论中详细阐述我的想法:如果你喜欢这种方式
LocalDate.plusMonths()
是的,然后用那个方法。刚才跑步时的输出(12月30日):
当然,假设您的程序在几个月内不会不间断地运行,您将需要某种方法来持久化数据。因此,我的代码将无法正常工作,但如果行为与预期的不同,您可能可以使用与我使用的相同的mthod调用。
zzlelutf2#
我想在你的描述中你试过一月和二月。这可能会引起问题。所以你必须手动处理这个案子。否则你的代码就正常了。
kqlmhetl3#
一个月不是精确的时间单位。想想看:我们可以准确地知道1分钟、1小时、1天和1周有多少秒。但是不同月份的秒数是不同的。所以你需要定义逻辑,你认为两个日期正好相差一个月是什么?一旦您定义了所有预期的行为(包括从1月30日算起正好一个月的情况)?2月28/29日?或者3月1日?)然后你可以看看是否有什么现成的东西适合你,或者你需要实现你自己的逻辑
6mw9ycah4#
我必须知道一个日期是否正好是一个又一个的x个月。
这是一个不明确的要求。一个明显的解释是:
但这确实意味着,3月30日之后一个月的日子是不可能存在的:没有2月30日,也永远不会有。
那是你真正想要的吗?考虑到一个月的长短取决于你问的是哪个月,“正好一个月后”不是一个明智的问题。因此:你到底是什么意思?
月的同一天,x个月后(意识到有许多日期是不可能有这样一个日期的)。
x天后,其中x是一些公式化的方法,基于我们所处的月份。