获取当月第一天和最后一天、获取前月的最后一天

这段Java代码演示了如何获取当前月份的第一天和最后一天,以及前一个月的最后一天。通过`Calendar`类和`SimpleDateFormat`进行日期操作,可用于日志记录或数据分析的日期范围设定。
// 获取当月第一天和最后一天
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String firstday, lastday;
Calendar cale = Calendar.getInstance();
cale.add(Calendar.MONTH, 0);
cale.set(Calendar.DAY_OF_MONTH, 1);
firstday = format.format(cale.getTime());
// 获取前月的最后一天
cale = Calendar.getInstance();
cale.add(Calendar.MONTH, 1);
cale.set(Calendar.DAY_OF_MONTH, 0);
lastday = format.format(cale.getTime());
System.out.println("本月第一天和最后一天分别是 : " + firstday + " and " + lastday);
<think>我们有两个引用提供了Java获取当月第一天最后一天的方法:引用[2]使用了Java 8的LocalDate类,引用[3]使用了Calendar类。用户的问题是在Java获取当月第一天最后一天的方法,我们可以根据这两种方式提供示例。 由于引用[2]使用了Java 8引入的java.time API(推荐),而引用[3]使用了旧的Calendar API(适用于Java 7及之),我们将分别展示这两种方法。 另外,引用[1]虽然提到了获取第一天最后一天,但没有具体代码,所以我们主要参考引用[2]引用[3]。 ### 方法1:使用Java 8的java.time API(推荐) Java 8引入了新的日期时间API(在java.time包中),使用LocalDate类可以很方便地处理日期。 #### 获取当月第一天 ```java import java.time.LocalDate; public class FirstAndLastDayOfMonth { public static void main(String[] args) { // 获取日期 LocalDate today = LocalDate.now(); // 获取本月第一天 LocalDate firstDay = today.withDayOfMonth(1); System.out.println("本月第一天: " + firstDay); // 获取本月最后一天 LocalDate lastDay = today.withDayOfMonth(today.lengthOfMonth()); System.out.println("本月最后一天: " + lastDay); } } ``` ### 方法2:使用Calendar类(旧版API) 如果项目使用的是Java 7或更早版本,可以使用Calendar类来实现。 #### 获取当月第一天 ```java import java.util.Calendar; import java.util.Date; public class FirstAndLastDayOfMonthOld { public static void main(String[] args) { // 获取Calendar实例 Calendar calendar = Calendar.getInstance(); // 设置为当月第一天,并将时间部分设为00:00:00.000 calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date firstDayOfMonth = calendar.getTime(); System.out.println("本月第一天: " + firstDayOfMonth); // 设置为下个第一天,然后减一天得到本月最后一天,并将时间部分设为23:59:59.999 calendar.add(Calendar.MONTH, 1); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.add(Calendar.DATE, -1); calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); calendar.set(Calendar.MILLISECOND, 999); Date lastDayOfMonth = calendar.getTime(); System.out.println("本月最后一天: " + lastDayOfMonth); } } ``` ### 注意事项 1. **时区问题**:上述两种方法默认使用系统默认时区。如果需要指定时区,可以在`LocalDate.now(ZoneId zone)`或`Calendar.getInstance(TimeZone zone)`中传入时区参数。 2. **Java版本**:如果使用Java 8及以上,推荐使用`java.time`API,因为它更清晰且线程安全。 3. **时间部分**: - 对于`LocalDate`,它只包含日期部分(年--日),没有时间,所以不需要设置时间。 - 对于`Calendar`,我们通常需要将时间部分设置为零点(第一天)或最后一刻(最后一天)以便于范围查询。 ### 总结 根据不同的Java版本,可以选择使用新的`java.time`API(简洁)或旧的`Calendar`API(兼容旧版本)来获取当月第一天最后一天。新的API更推荐使用[^2]。 §§相关问题§§ 1. 在Java中如何获取上个第一天最后一天? 2. 如何使用Java 8的日期时间API处理时区问题? 3. Java中如何计算两个日期之间的天数差? 4. 在Spring Boot项目中如何格式化日期输出? </think> 在Java获取当月第一天最后一天有几种常用方法,主要区别在于使用的APIJava版本支持。以下是推荐实现方案: ### 方法1:使用Java 8+的`java.time` API(推荐) ```java import java.time.LocalDate; import java.time.YearMonth; public class MonthRange { public static void main(String[] args) { // 获取日期 LocalDate today = LocalDate.now(); // 当月第一天 LocalDate firstDay = today.withDayOfMonth(1); System.out.println("本月第一天: " + firstDay); // 格式:2023-10-01 // 当月最后一天 LocalDate lastDay = YearMonth.from(today).atEndOfMonth(); System.out.println("本月最后一天: " + lastDay); // 格式:2023-10-31 } } ``` **优点**: - 线程安全且API设计直观 - 自动处理闰年份天数问题 - 无需手动计算时间边界[^2] ### 方法2:使用传统`Calendar` API(兼容Java 7及以下) ```java import java.util.Calendar; import java.util.Date; public class MonthRangeLegacy { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); // 当月第一天(时间设为00:00:00.000) calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date firstDay = calendar.getTime(); // 当月最后一天(时间设为23:59:59.999) calendar.add(Calendar.MONTH, 1); calendar.add(Calendar.DATE, -1); calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); calendar.set(Calendar.MILLISECOND, 999); Date lastDay = calendar.getTime(); } } ``` **适用场景**:需要兼容旧版Java的项目[^3] --- ### 关键细节说明 1. **时间精度处理**: - 第一天通常需要设置时间为`00:00:00.000` - 最后一天通常需要设置时间为`23:59:59.999` - 这对数据库范围查询(如`BETWEEN`)至关重要 2. **时区处理**: ```java // 指定时区(如上海时区) LocalDate today = LocalDate.now(ZoneId.of("Asia/Shanghai")); ``` 3. **格式化输出**: ```java DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String formattedFirstDay = firstDay.format(formatter); ``` 4. **其他变体**: ```java // 直接获取份对象 YearMonth currentMonth = YearMonth.now(); LocalDate firstDay = currentMonth.atDay(1); LocalDate lastDay = currentMonth.atEndOfMonth(); ``` --- ### 使用建议 1. **首选方案**:Java 8+项目使用`java.time` API(方法1),这是现代日期处理的行业标准 2. **兼容方案**:维护旧系统时使用`Calendar` API(方法2) 3. **重要提示**:避免使用已废弃的`Date`构造函数(如`new Date(2023, 10, 1)`) > 示例:当需要查询某数据时,配合数据库操作: > ```java > String sql = "SELECT * FROM orders WHERE order_date BETWEEN ? AND ?"; > preparedStatement.setObject(1, firstDay.atStartOfDay()); // 转LocalDateTime > preparedStatement.setObject(2, lastDay.atTime(23, 59, 59)); > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值