java组件:开始时间的N个周期结束时间的实现

本文介绍了一种在Java中计算给定开始日期和周期后的结束日期的方法,特别关注了按月周期的情况,考虑了不同月份天数和闰年的影响。

java组件:开始时间的N个周期结束时间的实现

根据按月、按季、按年等,计算开始时间对应的结束时间。

比如1月1号开始,周期是按月,那结束时间是什么时候?
比如1月31号开始,周期是按月,那结束时间是什么时候?
如果结束时间所在的月是2月、闰年2月、月数天数有31天,时间又如何变化?

实现:
已知开始时间和周期,需要得到一个结束时间:

    private String getPeriodEndDate(String startDateStr, int period) {
        Calendar endDateCalendar = getDate(startDateStr);
        int startDay = endDateCalendar.get(Calendar.DAY_OF_MONTH);
        // calendar会自动处理:
        // 1、如果增加某些月的数量,天超过月份中最大的天数时会被减到当月的最大值;
        // 2、如果减少某些天的数量,当减的天数大于月中已有的天数,则月数会减1;
        // 故当增加月份后若结束日期中的天与开始日期的天不一致时,说明结束月天数不够,不需要再减;否则需要减一天;
        // 一般周期都是从某天到下一个周期的该天减1,比如2018-12-24到2019-1-23就是一个周期,其中23是由24-1得来的;
        // 但如果是2018-1-31到2018-2-30,由于日历组件由1月加到2月的时候,会自动减到28(闰年则减到29),此时由于天数不够故不用减,直接用28/29即可;
        // 所以规律就是:日历组件加上N月之后,如果得到的天还与原来的天一样,则减1天,否则不减。
        endDateCalendar.add(Calendar.MONTH,  period);
        int endDay = endDateCalendar.get(Calendar.DAY_OF_MONTH);
        if(startDay == endDay) {
            endDateCalendar.add(Calendar.DAY_OF_MONTH, -1);
        }
        return new SimpleDateFormat("yyyy-MM-dd").format(endDateCalendar.getTime());
    }

 

    private Calendar getDate(String dateStr) {
        Date startDate = null;
        try {
            startDate = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
        } catch (ParseException e) {
            throw new IllegalArgumentException("Invalid start date, startDateStr=" + dateStr);
        }
        Calendar calendar = Calendar.getInstance(); 
        calendar.setTime(startDate);
        return calendar;
    }


    测试:

    private void testPeriodEndDate() {
        System.out.println(getPeriodEndDate("2018-01-01", 1)); // 输出: 2018-01-31
        System.out.println(getPeriodEndDate("2018-01-13", 1)); // 输出: 2018-02-12
        System.out.println(getPeriodEndDate("2018-01-31", 1)); // 输出: 2018-02-28
        System.out.println(getPeriodEndDate("2018-01-28", 1)); // 输出: 2018-02-27
        System.out.println(getPeriodEndDate("2000-01-29", 1)); // 输出: 2000-02-28
    }


    结束时间的计算:把开始时间加上对应周期之后减一天即为结束时间,若结束时间在对应的月份不存在则减到存在的那一天。

 

每天努力一点,每天都在进步。

### 计算当前年份第N周的开始结束时间 为了实现这一功能,可以借助 `java.time` 包中的 `LocalDateTime` 其他辅助类(如 `TemporalAdjusters`)。以下是具体的解决方案: 通过 `LocalDate.ofYearDay()` 方法找到指定年的第一天,再结合 `with(WeekFields.ISO.dayOfWeek())` 调整到该年第 N 周的第一天。接着使用 `atStartOfDay()` 将其转化为 `LocalDateTime` 对象。 #### 开始时间计算 对于一周的起始时间,默认 ISO 标准下的一周是从周一开始的。因此可以通过调整日期至当周的第一个工作日并设置时间为当天凌晨零点完成初始化[^1]。 #### 结束时间计算 同理可得周末的具体时刻——即周五晚上十一点五十九分或者周六午夜前一秒作为每周截止点,在此我们统一采用后者以便于理解与应用,则需进一步向后推移六整天再加上一天减去一毫秒形成最终结果[^2]。 下面是完整的代码示例展示如何基于给定参数 n 来取得对应周期内的区间端点值: ```java import java.time.*; import java.time.temporal.WeekFields; import java.util.Locale; public class WeekCalculator { public static void main(String[] args) { int year = Year.now().getValue(); // 当前年份 int weekNumber = 5; // 替换为你要查询的周次 LocalDateTime startOfWeek = getStartOfWeek(year, weekNumber); LocalDateTime endOfWeek = getEndOfWeek(startOfWeek); System.out.println("Start of Week: " + startOfWeek.format(DateTimeFormatter.ISO_DATE_TIME)); System.out.println("End of Week: " + endOfWeek.format(DateTimeFormatter.ISO_DATE_TIME)); } private static LocalDateTime getStartOfWeek(int year, int weekNumber){ LocalDate dateOfYearFirstDay = LocalDate.ofYearDay(year, 1); int daysToAdd = (weekNumber - 1)*7 - dateOfYearFirstDay.get(WeekFields.ISO.dayOfWeek())+1 ; return dateOfYearFirstDay.plusDays(daysToAdd).atStartOfDay(); } private static LocalDateTime getEndOfWeek(LocalDateTime startDateOfTheWeek){ return startDateOfTheWeek.plusDays(6).plusHours(23).plusMinutes(59).plusSeconds(59).plusMillis(999); } } ``` 上述程序定义了一个名为 `getStartOfWeek` 的函数用于定位特定年度内某编号自然周首个有效交易时段起点位置;另一个叫作 `getEndOfWeek` 则负责构建相应终止界限坐标系。这两个组件共同协作实现了题目要求的功能目标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

powerfuler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值