好吧,看了一堆代码让我头晕目眩,但现在我要解决一些看起来很容易但我不明白的问题。
我需要更新一个函数,当前得到今天的日期,检查它是否不是星期六,如果不是,那么我们继续并使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;
}
}