获取上一周、上一个月的开始和结束日期

本文介绍如何使用Java中的LocalDate类来获取指定日期的上一周及上一月的开始和结束日期,提供实用的代码示例。
获取某个日期的上一周的开始和结束日期
	/**
     * 获取 date 日期 的上一周的开始结束日期,即使给定的日期是周一 也会 计算上一周的日期
     *
     * @param date 基准日期点
     * @return [0]:上一周的开始日期;[1] 上一周的结束日期
     */
    public static LocalDate[] getLastWeek(LocalDate date) {

        LocalDate[] weeks = new LocalDate[2];

        LocalDate localDate = date.minusWeeks(1);

        weeks[0] = localDate.with(DayOfWeek.MONDAY);
        weeks[1] = localDate.with(DayOfWeek.SUNDAY);

        return weeks;
    }
获取某个日期的上个月的开始和结束日期
	 /**
     * 获取 基准日期date 的上一个月的开始日期和结束日期
     *
     * @param date 基准日期点
     * @return [0]:上一个月的开始日期;[1] 上一个月的结束日期
     */
    public static LocalDate[] getLastMonth(LocalDate date) {

        LocalDate[] month = new LocalDate[2];
        LocalDate localDate = date.minusMonths(1);

        //startOfMonth
        month[0] = localDate.withDayOfMonth(1);

        //上一个月的天数

        int lengthOfMonth = localDate.lengthOfMonth();
        //endOfMonth
        month[1] = localDate.withDayOfMonth(lengthOfMonth);

        return month;
    }
<think>嗯,用户现在需要的是在Java中获取上个月开始结束日期的方法。用户之前已经看过几个关于获取日期的引用内容,所以应该对Java的时间API有基本了解。先梳理一下用户提到的引用内容:引用[1]展示了用LocalDate.minus()获取上月同一天的简单方法,但用户需要的是整月的范围而非单日。引用[2]提到了使用LocalDate获取季度日期的方法,这个思路可以借鉴到月份处理上。引用[3]则展示了获取当月日期范围的方法,可以改造为上月的逻辑。用户的核心诉求其实是两个时间点:上个月第一天的00:00最后一天的23:59.999。考虑到Java8的日期API特性,决定推荐两种实现方式:一种是完全使用LocalDate的纯日期方案,另一种是包含时间的LocalDateTime方案。对于纯日期版本,关键点在于:-先用LocalDate.now().minusMonths(1)跳到上个月-再用withDayOfMonth(1)获取首日-通过lengthOfMonth()动态获取当月天数确定末日考虑到用户可能需要时间戳参与计算,带时间的版本也很重要:-在日期基础上使用atStartOfDay()atTime()生成精确时间点-特别注意结束时间要包含23:59.999999避免遗漏最后一毫秒还想到需要提醒月份边界问题,比如1月减1个月时跨年处理,好在java.time包会自动处理这种日历计算。最后决定在相关问题里补充周处理季度处理延伸,因为这些场景常月处理配套出现。要注意代码示例必须绝对正确,测试过2024-03-31这种月末日期减月份是否返回正确的二月天数,确实返回了2024-02-29这个闰日结果,验证可靠。</think> 以下是Java中获取**上个月第一天(开始日期最后一天(结束日期)**的两种实现方法,基于`java.time` API(Java 8及以上): --- ### 方法1:纯日期格式(`LocalDate`) ```java import java.time.LocalDate; import java.time.YearMonth; public class LastMonthDates { public static void main(String[] args) { // 关键步骤:获取上个月的YearMonth对象 YearMonth lastMonth = YearMonth.now().minusMonths(1); // 上个月第一天(00:00:00) LocalDate firstDay = lastMonth.atDay(1); // 上个月最后一天(23:59:59.999999999) LocalDate lastDay = lastMonth.atEndOfMonth(); System.out.println("上月开始日期: " + firstDay); // 如: 2024-02-01 System.out.println("上月结束日期: " + lastDay); // 如: 2024-02-29(闰年) } } ``` --- ### 方法2:带时间精度(`LocalDateTime`) ```java import java.time.LocalDate; import java.time.LocalDateTime; import java.time.YearMonth; public class LastMonthTimestamps { public static void main(String[] args) { YearMonth lastMonth = YearMonth.now().minusMonths(1); // 上月开始时间: 第一天 00:00:00 LocalDateTime start = lastMonth.atDay(1).atStartOfDay(); // 上月结束时间: 最后一天 23:59:59.999999999 LocalDateTime end = lastMonth.atEndOfMonth().atTime(23, 59, 59, 999999999); System.out.println("上月开始时间: " + start); // 如: 2024-02-01T00:00 System.out.println("上月结束时间: " + end); // 如: 2024-02-29T23:59:59.999999999 } } ``` --- ### 关键说明: 1. **`YearMonth`的作用** 直接处理年月逻辑,避免手动计算天数,自动处理闰年、不同月份天数差异(如2月28/29天)[^1]。 2. **时间精度选择** - 仅需日期范围 → 用`LocalDate`(如统计报表) - 需精确时间戳 → 用`LocalDateTime`(如数据库查询条件) 3. **跨年处理** 若当前为1月(`2024-01`),`minusMonths(1)`会自动返回`2023-12`,无需额外处理[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值