1

我有一个付款支票应用程序,因为我得到了 2 个字符串:

String contractBegin = "01-01-2018";
String contractEnd = "31-12-2018";

现在每次付款都必须在每月的最后一个星期五完成。我需要计算这些日期并将其放在列表或数组中。

有没有使用 Java 8 不错的特性来做到这一点的最佳方法?

我从这里开始:

    String contractBegin = "01-01-2018";
    String contractEnd = "31-12-2018";

    LocalDate contractStart = LocalDate.parse(contractBegin, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
    LocalDate contractStop = LocalDate.parse(contractEnd, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
    System.out.println(contractStart);
    System.out.println(contractStop);
    List<LocalDate> payCheck= new ArrayList<>();
    for (int i = 0; i < args.length; i++) {
        payCheck.add(...) ??
    }
4

2 回答 2

3

我不确定你的args数组。但是,如果您想在合同开始日期和结束日期之间获得每月的最后一个星期五。我会这样做:

    String contractBegin = "01-01-2018";
    String contractEnd = "31-12-2018";

    LocalDate contractStart = LocalDate.parse(contractBegin, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
    LocalDate contractStop = LocalDate.parse(contractEnd, DateTimeFormatter.ofPattern("dd-MM-yyyy"));

    List<LocalDate> payCheck = new ArrayList<>();
    LocalDate payCheckDate = contractStart;

    while (payCheckDate.isBefore(contractStop)) {
        payCheckDate = payCheckDate
                .with(lastDayOfMonth())
                .with(previousOrSame(DayOfWeek.FRIDAY));
        payCheck.add(payCheckDate);
        payCheckDate = payCheckDate.with(TemporalAdjusters.firstDayOfNextMonth());

    }

    payCheck.forEach(System.out::println);

这给了你每个月的最后一个星期五。

于 2017-06-08T10:52:52.600 回答
2

@gnostrenoff 答案的另一种选择是使用TemporalAdjusters.lastInMonth()方法,它为您提供该月指定的一周中的最后一天:

// get the last Friday of the month
payCheckDate = payCheckDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY));

while循环的其余部分与@gnostrenoff 的答案相同。

于 2017-06-08T11:44:31.127 回答