获取未来双周日期

时间:2018-05-01 02:43:02

标签: java date math calendar

我的双周付款是从2015年1月1日开始的(这就是我的Date对象,顺便说一下是星期四)。

我如何才能找到何时需要在2018年5月支付第一笔款项? (我不关心一个月内的第二次或第三次付款。)

我会展示我所做的工作,但我无法开始思考如何思考这个问题。

3 个答案:

答案 0 :(得分:1)

您可以创建一个日期时间对象,然后继续添加周(2 * 7天),直到月份和年份正确为止。

答案 1 :(得分:1)

如果我是你,我会使用Stream<LocalDate>

LocalDate start = LocalDate.of(2015, 1, 1);

System.out.println(Stream.iterate(start, d -> d.plusWeeks(2))
                         .filter(d -> d.getMonth() == Month.MAY && d.getYear() == 2018)
                         .findFirst()
                         .get());

输出:

2018-05-03

我忘记了从无限流中获取元素的正确方法,但这是一种方法。

答案 2 :(得分:1)

如果你喜欢在没有任何循环或迭代的情况下这样做,那只需要一点点诡计:

    LocalDate firstPayment = LocalDate.of(2015, Month.JANUARY, 1);
    // The first payment in May 2018 must be within the first 14 days of May.
    long weeksAfterFirst
            = ChronoUnit.WEEKS.between(firstPayment, LocalDate.of(2018, Month.MAY, 14));
    // We need an even number of weeks
    if (weeksAfterFirst % 2 != 0) {
        weeksAfterFirst--;
    }
    LocalDate firstInMay = firstPayment.plusWeeks(weeksAfterFirst);
    System.out.println(firstInMay);

打印

  

2018年5月3日

对于如何开始这样的任务,第一步是研究日期和时间库以了解可能性。 教程链接: Oracle tutorial: Date Time解释了如何使用java.time