两个localdate之间的月差

zvokhttg  于 2021-06-27  发布在  Java
关注(0)|答案(4)|浏览(227)

我知道这方面有很多问题,但我找不到一个和我的案子相符的。我必须知道一个日期是否正好是一个又一个的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的例子只是从我的测试中提取出来的,但是我感谢我可以这样做,这样就不用自己做一个有很多条件的复杂算法了。

vsnjm48y

vsnjm48y1#

我可能还没拿到。尽管如此,请允许我试一下,从评论中详细阐述我的想法:如果你喜欢这种方式 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调用。

zzlelutf

zzlelutf2#

我想在你的描述中你试过一月和二月。这可能会引起问题。所以你必须手动处理这个案子。否则你的代码就正常了。

kqlmhetl

kqlmhetl3#

一个月不是精确的时间单位。想想看:我们可以准确地知道1分钟、1小时、1天和1周有多少秒。但是不同月份的秒数是不同的。所以你需要定义逻辑,你认为两个日期正好相差一个月是什么?一旦您定义了所有预期的行为(包括从1月30日算起正好一个月的情况)?2月28/29日?或者3月1日?)然后你可以看看是否有什么现成的东西适合你,或者你需要实现你自己的逻辑

6mw9ycah

6mw9ycah4#

我必须知道一个日期是否正好是一个又一个的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是一些公式化的方法,基于我们所处的月份。

相关问题