【问题标题】:Get future bi weekly date获取未来的双周日期
【发布时间】:2018-05-01 02:43:01
【问题描述】:

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

我如何知道我必须在 2018 年 5 月支付第一笔款项的时间? (我不在乎一个月内的第二次或第三次付款)。

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

【问题讨论】:

  • 最简单的方法是有一个循环,每次增加 2 周,直到 2018 年 5 月。

标签: java date math calendar


【解决方案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-05-03

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 这是解决它的一种方法,但它听起来是一种非常缓慢的解决方法。没有更快的方法吗?
  • 你可以计算两个日期之间的天数,然后找到14的余数,那么最终的答案就是14-x。但另一方面,循环方法需要几毫秒,避免一个错误可能需要一整分钟。也许两个!
【解决方案3】:

如果我是你,我会使用 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 2010-11-19
    • 2021-12-31
    相关资源
    最近更新 更多