杰瑞科技汇

Java的Calendar的get方法如何正确使用?

Calendar 类是 Java 早期用于处理日期和时间的一个核心类(虽然现在推荐使用 java.time 包,但 Calendar 在遗留代码中仍然非常普遍)。get() 方法是 Calendar 类中最常用的方法之一,用于获取日历字段(如年、月、日、小时等)的值。

Java的Calendar的get方法如何正确使用?-图1
(图片来源网络,侵删)

方法签名

get() 方法的签名非常简单:

public int get(int field)
  • 参数: int field,这是一个整数值,代表你想要获取的日历字段,这些字段在 Calendar 类中定义为静态常量
  • 返回值: int,对应日历字段的当前值。

常用的日历字段 (Field)

这些字段是 Calendar 类中定义的 public static final int 常量,你需要使用它们来指定要获取哪个字段的值。

字段常量 含义 示例 (2025-10-27 15:30:00)
YEAR 1 2025
MONTH 2 月 (重要!) 9 (注意:0代表一月,11代表十二月)
DAY_OF_MONTH 5 月中的第几天 27
DAY_OF_WEEK 7 周中的第几天 (周日为1,周六为7) 6 (星期五)
HOUR 10 12小时制的小时 3
HOUR_OF_DAY 11 24小时制的小时 15
MINUTE 12 分钟 30
SECOND 13 0
MILLISECOND 14 毫秒 0
AM_PM 9 上/下午 (0=AM, 1=PM) 1 (下午)

⚠️ 特别注意:MONTH 字段

Calendar 中的 MONTH 字段是从 0 开始计数的,这是一个非常常见的陷阱!

  • 0 代表 一月
  • 1 代表 二月
  • 11 代表 十二月

当你用 get(Calendar.MONTH) 获取到值后,通常需要加 1 才能得到我们习惯的月份。

Java的Calendar的get方法如何正确使用?-图2
(图片来源网络,侵删)

使用示例

下面是一个完整的示例,展示了如何使用 get() 方法获取各种日期和时间信息。

import java.util.Calendar;
public class CalendarGetExample {
    public static void main(String[] args) {
        // 1. 获取一个 Calendar 实例
        // Calendar 是一个抽象类,通常使用 getInstance() 获取其子类(通常是 GregorianCalendar)的实例
        Calendar calendar = Calendar.getInstance();
        // 2. 使用 get() 方法获取各个字段的值
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH); // 注意:月份是从0开始的
        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); // 1=周日, 2=周一, ..., 7=周六
        int hour24 = calendar.get(Calendar.HOUR_OF_DAY); // 24小时制
        int hour12 = calendar.get(Calendar.HOUR);        // 12小时制
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        int ampm = calendar.get(Calendar.AM_PM); // 0=AM, 1=PM
        // 3. 打印结果
        System.out.println("当前日期和时间: " + calendar.getTime());
        System.out.println("-----------------------------------");
        System.out.println("年份: " + year);
        System.out.println("月份 (Calendar内部值): " + month + " (实际月份是: " + (month + 1) + ")");
        System.out.println("月中的第几天: " + dayOfMonth);
        System.out.println("周中的第几天 (1=周日): " + dayOfWeek + " (" + getDayName(dayOfWeek) + ")");
        System.out.println("-----------------------------------");
        System.out.println("24小时制小时: " + hour24);
        System.out.println("12小时制小时: " + hour12);
        System.out.println("分钟: " + minute);
        System.out.println("秒: " + second);
        System.out.println("上午/下午 (0=AM, 1=PM): " + ampm + " (" + (ampm == Calendar.AM ? "AM" : "PM") + ")");
    }
    // 一个辅助方法,将数字星期转换为名称
    private static String getDayName(int dayOfWeek) {
        String[] days = {"", "周日", "周一", "周二", "周三", "周四", "周五", "周六"};
        return days[dayOfWeek];
    }
}

可能的输出:

当前日期和时间: Fri Oct 27 15:30:00 CST 2025
-----------------------------------
年份: 2025
月份 (Calendar内部值): 9 (实际月份是: 10)
月中的第几天: 27
周中的第几天 (1=周日): 6 (周五)
-----------------------------------
24小时制小时: 15
12小时制小时: 3
分钟: 30
秒: 0
上午/下午 (0=AM, 1=PM): 1 (PM)

与现代 Java 8+ java.time 包的对比

虽然 Calendar 仍然可用,但从 Java 8 开始,官方推荐使用 java.time 包中的类,因为它们更直观、更不容易出错,并且是不可变的(线程安全)。

使用 java.timeLocalDateTime 来实现同样的功能:

Java的Calendar的get方法如何正确使用?-图3
(图片来源网络,侵删)
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.DayOfWeek;
public class JavaTimeExample {
    public static void main(String[] args) {
        // 1. 获取当前日期和时间
        LocalDateTime now = LocalDateTime.now();
        // 2. 获取各个字段的值
        int year = now.getYear();
        int month = now.getMonthValue(); // 直接得到 1-12 的值,无需加1!
        int dayOfMonth = now.getDayOfMonth();
        DayOfWeek dayOfWeek = now.getDayOfWeek(); // 返回的是枚举类型,更安全
        int hour24 = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();
        // 3. 打印结果
        System.out.println("当前日期和时间: " + now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
        System.out.println("-----------------------------------");
        System.out.println("年份: " + year);
        System.out.println("月份: " + month); // 无需加1,非常直观
        System.out.println("月中的第几天: " + dayOfMonth);
        System.out.println("周中的第几天: " + dayOfWeek); // 直接输出枚举名称,如 FRIDAY
        System.out.println("-----------------------------------");
        System.out.println("24小时制小时: " + hour24);
        System.out.println("分钟: " + minute);
        System.out.println("秒: " + second);
    }
}

对比总结:

特性 java.util.Calendar java.time.LocalDateTime
月份 0 开始,需要加1 1 开始,直观
星期 返回数字 (1=周日) 返回 DayOfWeek 枚举,更安全
可变性 可变,线程不安全 不可变,线程安全
API 设计 混乱,很多方法名不直观 清晰、一致、符合 fluent API 风格
推荐度 遗留代码,不推荐新项目使用 强烈推荐,Java 8+ 的标准
  • calendar.get(field) 是从 Calendar 对象中提取特定日期或时间部分(如年、月、日)的核心方法。
  • 关键点:参数 field 必须是 Calendar 类中定义的静态常量(如 Calendar.YEAR)。
  • 最大陷阱Calendar.MONTH 返回的值是 0-11,而不是 1-12,需要手动加1才能得到常规月份。
  • 最佳实践:对于所有新的 Java 项目,请优先使用 java.time 包,它提供了更现代、更安全、更易用的 API。
分享:
扫描分享到社交APP
上一篇
下一篇