计算如何获得双周一周的最后结束日期



好吧,看了一堆代码让我头晕目眩,但现在我要解决一些看起来很容易但我不明白的问题。

我需要更新一个函数,当前得到今天的日期,检查它是否不是星期六,如果不是,那么我们继续并使java调用星期六,然后添加-7天。这个函数允许我们获得工资周期的最后一天,但是现在我们要每两周支付一次,所以现在我需要更新代码来检查日期,如果它比最后一周的工资日期(7/11/2021 - 7/17/2021)更大。我们的第一个双周工资是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;}

我可能错了,所以请随时纠正我,我会做出调整。看完要求后,你真正想做的似乎是得到从现在到下一个发薪日之间的持续时间。要做到这一点,你需要知道下一个发薪日期。

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

这样我们就知道发薪期的开始是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.");
    }

下一个发薪日为2021-08-01,9天后。

同样,这有点超出了范围,但如果你想涵盖一些基础,你可以验证输入。

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

我想你得查一下周数。如果你总是在偶数周支付,下面的代码将工作。

包含测试代码。

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;
    }
}