弄清楚如何获得双周的最后一个结束日期

figure out how to get the last enddate of a bi-weekly week

好吧,我在复习了一堆其他代码后头晕目眩,但现在我必须解决一些看似简单但我无法弄清楚的事情。

我需要更新一个当前获取今天日期的函数,检查它是否不是星期六,如果不是,那么我们继续将 java 校准到星期六,然后添加 -7 天。此函数允许我们获得支付期的最后一天,但现在我们要每两周支付一次,所以现在我需要更新代码以检查日期,如果它大于最后一周的支付日期,即 7 /17 日(2021 年 7 月 11 日 - 2021 年 7 月 17 日)。我们的第一个双周工资是 7/18 - 7/31 所以这些天中的任何一天都需要寻找最后一个结束日期是 7/17 然后所有其他双周需要查看另一个双周的结束日期.所以我需要找出逻辑来计算它会给一周增加多少 -x 。我的想法是将 -7 添加到双周的第一周和 -14 或双周的第二周。尽量避免在整个代码中进行大刀阔斧的更新。

public Calendar getLastEndDate() {
     Calendar cal = Calendar.getInstance();
     if(cal.get(Calendar.DAY_OF_WEEK)!=Calendar.SATURDAY){
         cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
         cal.add(Calendar.DATE, -7);
     }
     
    cal.set(Calendar.HOUR_OF_DAY,0);
    cal.set(Calendar.MINUTE,0);
    cal.set(Calendar.SECOND,0);
    cal.set(Calendar.MILLISECOND,0);
return cal;}

我认为您必须检查周数。 如果您总是在偶数周进行付款,则以下代码将起作用。

包含测试代码。

import java.text.DateFormat;
import java.util.Calendar;

import static java.util.Calendar.*;

public class BiWeekly {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        DateFormat df = DateFormat.getDateInstance();
        for (int i = 1; i <= 31; i++) {
            cal.set(DATE, i);
            System.out.print("Today is: " + df.format(cal.getTime()));
            System.out.print(", Week: " + cal.get(WEEK_OF_YEAR));
            BiWeekly bw = new BiWeekly();
            System.out.println(", Last payout was: " + df.format(bw.getLastEndDate(cal).getTime()));
        }
    }

    public Calendar getLastEndDate(Calendar orig) {
        Calendar cal = new Calendar.Builder().setInstant(orig.getTime()).build();
        int week = cal.get(WEEK_OF_YEAR);
        if (week % 2 == 0) {
            cal.add(DATE, -7);
        }
        else {
            cal.add(DATE, -14);
        }
        cal.set(DAY_OF_WEEK, SATURDAY);

        cal.set(HOUR_OF_DAY, 0);
        cal.set(MINUTE, 0);
        cal.set(SECOND, 0);
        cal.set(MILLISECOND, 0);
        return cal;
    }
}

我可能是错的,请随时纠正我,我会做出调整。查看要求后,您似乎真正想要做的是获取从现在到下一个支付日期之间的持续时间。为此,您需要知道下一个付款日期。

要计算支付日期,我们可以使用您指定的初始日期并继续 N days/weeks,直到当前日期在支付期的结束日期之前。

这样我们就知道支付期的开始是 endDate - cycle,到支付日期的持续时间是 endDate - currentDate

    public static void main(String[] args) {
        LocalDate firstPayDate = LocalDate.of(2021, 7, 18);

        LocalDate currentDate = LocalDate.now();

        Period payCycle = Period.ofWeeks(2);

        LocalDate nextPayDate = nextPayDate(firstPayDate, payCycle, currentDate);

        Period periodUntilPayDate = Period.between(currentDate, nextPayDate);

        System.out.printf("Next pay date is in %d days on %s.",
                periodUntilPayDate.getDays(),
                nextPayDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
    }

    private static LocalDate nextPayDate(LocalDate payDate, Period payCycle, LocalDate currentDate) {
        while (currentDate.isAfter(payDate)) {
            payDate = payDate.plus(payCycle);

            if (currentDate.isBefore(payDate)) {
                return payDate;
            }
        }
        throw new IllegalStateException("Could not find pay period.");
    }

Next pay date is in 9 days on 2021-08-01.

此外,这有点超出范围,但如果您想涵盖一些基础,您可以验证输入。

        Preconditions.checkNotNull(payDate);
        Preconditions.checkNotNull(payCycle);
        Preconditions.checkNotNull(currentDate);
        Preconditions.checkArgument(!payCycle.isNegative());
        Preconditions.checkArgument(!payCycle.isZero());