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 实例 – 获取年份、月份等 的操作,不仅能提升你的编码能力,也能让你在面对复杂业务时更加从容。从今天起,让每一个日期都“有迹可循”。