You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:38:54