繁体   English   中英

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

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

好吧,我在审查一堆其他代码时头晕目眩,但现在我必须解决一些看起来很容易但我无法弄清楚的事情。

我需要更新一个当前获取今天日期的函数,检查它是否不是星期六,如果不是,那么我们继续让 java cal 到星期六,然后添加 -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 天/周,直到当前日期在支付期的结束日期之前。

这样我们就知道支付期的开始是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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM