Java 实例 – 获取年份、月份等(完整教程)

Java 实例 – 获取年份、月份等

在 Java 编程中,处理日期和时间是开发中非常常见的需求。无论是记录用户登录时间、生成报表、还是做业务逻辑判断,我们几乎总会遇到“获取当前年份”“提取月份”“判断是否为闰年”这类操作。今天我们就来深入聊聊这个话题,通过几个真实可用的 Java 实例,帮你掌握如何从日期中精准提取年、月、日等信息。

这不仅是一个技术点,更是一种“时间管理能力”的体现。就像我们每天要记录日程、安排任务,程序也需要准确理解“什么时候发生了什么事”。而 Java 提供了完善的 API 来完成这项工作,关键在于你是否掌握了正确的方法。


传统方式:使用 Calendar 类

在 Java 早期版本中,Calendar 是处理日期时间的核心类。虽然现在推荐使用新的 java.time 包,但了解它仍然有助于理解历史演变。

下面是一个获取年份、月份的典型示例:

import java.util.Calendar;

public class DateExample {
    public static void main(String[] args) {
        // 获取当前时间的 Calendar 实例
        Calendar calendar = Calendar.getInstance();

        // 获取年份(注意:Calendar 年份从 1900 开始,所以要加 1900)
        int year = calendar.get(Calendar.YEAR);
        // 获取月份(注意:月份从 0 开始,0 表示 1 月,所以要加 1)
        int month = calendar.get(Calendar.MONTH) + 1;
        // 获取日期(即几号)
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        // 输出结果
        System.out.println("当前年份:" + year);
        System.out.println("当前月份:" + month);
        System.out.println("当前日期:" + day);
    }
}

注释说明:

  • Calendar.getInstance():获取当前系统时间的实例。
  • get(Calendar.YEAR):返回的是相对于 1900 年的年份偏移,比如 2024 年返回的是 124,所以要加 1900 才是真实年份。
  • get(Calendar.MONTH):月份从 0 开始计数,0 是 1 月,1 是 2 月……所以必须加 1 才能得到真实月份。
  • 这种方式虽然可用,但代码易读性差,容易出错,特别是对新手来说。

推荐方式:使用 java.time 包(Java 8+)

从 Java 8 开始,引入了全新的日期时间 API,即 java.time 包。它比 Calendar 更直观、更安全,也更符合现代编程习惯。我们强烈建议新项目使用这套 API。

获取年份、月份、日期

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class DateTimeExample {
    public static void main(String[] args) {
        // 获取当前日期,不包含时间
        LocalDate today = LocalDate.now();

        // 提取年份
        int year = today.getYear();
        // 提取月份(返回的是 Month 枚举,如 MAY)
        int monthValue = today.getMonthValue(); // 1-12 的整数
        // 提取日期(几号)
        int dayOfMonth = today.getDayOfMonth();

        // 输出结果
        System.out.println("当前年份:" + year);
        System.out.println("当前月份:" + monthValue);
        System.out.println("当前日期:" + dayOfMonth);

        // 可选:格式化输出,如 2024-05-20
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String formattedDate = today.format(formatter);
        System.out.println("格式化日期:" + formattedDate);
    }
}

注释说明:

  • LocalDate.now():获取当前日期,不包含时分秒。
  • getYear():直接返回完整的年份,比如 2024。
  • getMonthValue():返回 1 到 12 的整数,无需加减。
  • getDayOfMonth():直接返回几号。
  • DateTimeFormatter.ofPattern(...):用于格式化输出,提高可读性。

获取月份名称(中文/英文)

有时候我们需要显示“五月”而不是“5”,这时可以使用 Month 枚举。

import java.time.Month;
import java.time.LocalDate;

public class MonthNameExample {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();

        // 获取月份枚举
        Month month = date.getMonth();

        // 获取英文名称,如 "MAY"
        String englishName = month.name();
        // 获取中文名称(需要通过格式化器)
        String chineseName = month.getDisplayName(java.time.format.TextStyle.FULL, java.util.Locale.CHINESE);

        System.out.println("英文月份:" + englishName);
        System.out.println("中文月份:" + chineseName);
    }
}

注释说明:

  • getMonth() 返回的是 Month 枚举对象,包含完整信息。
  • name() 返回大写的英文常量名,如 MAY。
  • getDisplayName(...) 可以根据语言环境返回本地化名称。这里使用 Locale.CHINESE 得到中文“五月”。

判断是否为闰年

闰年规则是:能被 4 整除但不能被 100 整除,或者能被 400 整除。LocalDate 提供了便捷方法判断。

import java.time.LocalDate;

public class LeapYearExample {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2024, 2, 29); // 2024 年 2 月 29 日

        // 判断当前年份是否为闰年
        boolean isLeapYear = date.isLeapYear();

        if (isLeapYear) {
            System.out.println("这是一个闰年,2 月有 29 天!");
        } else {
            System.out.println("这不是闰年,2 月只有 28 天。");
        }
    }
}

注释说明:

  • isLeapYear()LocalDate 的一个方法,自动判断是否为闰年。
  • 你也可以手动判断:year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)

实际应用:生成带日期的订单编号

假设你要生成一个订单号,格式为 ORD202405201234,其中包含年、月、日和流水号。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class OrderIdGenerator {
    private static int counter = 1;

    public static String generateOrderId() {
        // 获取当前日期
        LocalDate today = LocalDate.now();
        // 格式化为 yyyymmdd
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        String datePart = today.format(formatter);

        // 流水号,补零到 4 位
        String serial = String.format("%04d", counter++);
        // 拼接订单号
        return "ORD" + datePart + serial;
    }

    public static void main(String[] args) {
        System.out.println("订单号 1:" + generateOrderId());
        System.out.println("订单号 2:" + generateOrderId());
        System.out.println("订单号 3:" + generateOrderId());
    }
}

注释说明:

  • DateTimeFormatter.ofPattern("yyyyMMdd"):将日期格式化为 8 位字符串。
  • String.format("%04d", counter++):将整数补零到 4 位,如 1 → 0001。
  • 每次调用 generateOrderId() 生成唯一订单号,适合用于业务系统。

常见误区与注意事项

问题 原因 正确做法
月份显示为 0 使用了 Calendar.MONTH 而未 +1 改用 getMonthValue()
年份少 1900 使用 Calendar.YEAR 返回的是偏移值 加 1900 或改用 LocalDate.getYear()
时间格式混乱 没有统一格式化 使用 DateTimeFormatter 统一输出

总结

本文通过多个实际代码示例,详细讲解了如何在 Java 中获取年份、月份、日期等信息。我们对比了传统的 Calendar 和现代推荐的 java.time API,强调了后者在可读性、安全性和易用性上的优势。

无论是初学者还是中级开发者,掌握这些基础但关键的操作,都能让你的代码更专业、更健壮。特别是在处理时间相关的业务逻辑时,准确提取时间字段是避免 bug 的第一步。

记住:时间是程序的节奏,而正确的日期处理,就是让程序走得稳、走得准。

在日常开发中,多练习这些 Java 实例 – 获取年份、月份等 的操作,不仅能提升你的编码能力,也能让你在面对复杂业务时更加从容。从今天起,让每一个日期都“有迹可循”。