如何用Java Calendar获取每月第一天?月历程序日期问题排查
Java Calendar 相关问题解答
1. 如何使用Java Calendar获取每月的第一天?
要获取指定年月的第一天,核心要注意java.util.Calendar的月份是从0开始计数(0代表1月,11代表12月),具体步骤如下:
- 获取Calendar实例:用
Calendar.getInstance()获取当前时区的日历对象 - 清除默认字段:调用
clear()清空所有默认值(避免当前日期的日、时、分等字段干扰计算) - 设置目标年月:将年份直接传入,月份需转成0-based格式(如果用户输入的是1-12的月份,记得减1)
- 固定日期为1:将
DAY_OF_MONTH字段设为1,即可定位到该月第一天
代码示例:
import java.util.Calendar; public class FirstDayDemo { public static void main(String[] args) { int targetYear = 2024; int targetMonth = 4; // 用户输入的4月,转成0-based就是3 Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.YEAR, targetYear); calendar.set(Calendar.MONTH, targetMonth - 1); calendar.set(Calendar.DAY_OF_MONTH, 1); // 输出结果,格式为默认的Date字符串 System.out.println("该月第一天: " + calendar.getTime()); } }
这里的clear()非常关键——默认的Calendar实例会携带当前日期的所有字段值,如果不清除直接设置年月,日字段可能保留当前日期,导致结果偏离预期。
2. 修复月历程序的日期计算问题
根据你的描述,2018年1月显示正常但其他年月出错,大概率是月份的0-based转换错误,或者没有清除Calendar默认字段导致的。我先还原你可能的错误场景,再给出修复方案:
常见错误代码(你可能踩了这个坑)
// 假设用户输入year=2019,month=2(2月) Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month); // 错误!用户输入的2是2月,但Calendar的2代表3月 cal.set(Calendar.DAY_OF_MONTH, 1); int firstDayWeek = cal.get(Calendar.DAY_OF_WEEK);
这种情况下,用户输入的1月(month=1)会被设置成Calendar的2月,但可能测试时默认实例刚好是2018年1月的日期,巧合下显示正确;换其他月份时,月份偏移的问题就暴露出来了。
修复后的代码片段
import java.util.Calendar; // 假设从用户输入获取的年份和月份(比如year=2024,month=5代表5月) int userInputYear = 2024; int userInputMonth = 5; Calendar cal = Calendar.getInstance(); cal.clear(); // 必须先清除默认字段,避免当前日期干扰 cal.set(Calendar.YEAR, userInputYear); cal.set(Calendar.MONTH, userInputMonth - 1); // 转成0-based月份 cal.set(Calendar.DAY_OF_MONTH, 1); // 获取该月第一天的星期(Calendar.SUNDAY=1,MONDAY=2,以此类推) int firstDayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 获取该月的总天数 int totalDays = cal.getActualMaximum(Calendar.DAY_OF_MONTH); System.out.println("该月第一天是星期" + firstDayOfWeek); System.out.println("该月共有" + totalDays + "天");
额外提示
如果你的排版逻辑依赖星期的起始(比如有些地区周一作为一周第一天),可以用cal.setFirstDayOfWeek(Calendar.MONDAY)来调整,这样计算出来的星期值会更符合排版需求。
内容的提问来源于stack exchange,提问作者user9587342
相关产品推荐
相关产品推荐

