Java GregorianCalendar 类

GregorianCalendar 是 Java 中一个表示公历(格里高利历)的日历类,它继承自 Calendar 类。这个类提供了标准的日历系统,也是世界上大多数国家使用的日历系统。

GregorianCalendar 类位于 java.util 包中,用于处理日期和时间相关的操作。它支持从公元 1 年到未来的日期计算,并考虑了闰年等复杂的日历规则。


GregorianCalendar 的基本使用

创建 GregorianCalendar 实例

创建 GregorianCalendar 实例有多种方式:

实例

// 创建表示当前日期和时间的实例
GregorianCalendar calendar1 = new GregorianCalendar();

// 创建指定年份、月份、日期的实例
// 注意:月份从0开始,0表示1月
GregorianCalendar calendar2 = new GregorianCalendar(2023, 10, 15);

// 创建指定年份、月份、日期、小时、分钟的实例
GregorianCalendar calendar3 = new GregorianCalendar(2023, 10, 15, 14, 30);

// 创建指定年份、月份、日期、小时、分钟、秒的实例
GregorianCalendar calendar4 = new GregorianCalendar(2023, 10, 15, 14, 30, 45);

获取日期和时间信息

实例

GregorianCalendar calendar = new GregorianCalendar();

int year = calendar.get(Calendar.YEAR);       // 获取年份
int month = calendar.get(Calendar.MONTH);    // 获取月份(0-11)
int day = calendar.get(Calendar.DAY_OF_MONTH); // 获取日期
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取小时(24小时制)
int minute = calendar.get(Calendar.MINUTE);   // 获取分钟
int second = calendar.get(Calendar.SECOND);   // 获取秒

设置日期和时间

实例

GregorianCalendar calendar = new GregorianCalendar();

// 设置年份
calendar.set(Calendar.YEAR, 2024);

// 设置月份(0-11)
calendar.set(Calendar.MONTH, Calendar.JANUARY);

// 设置日期
calendar.set(Calendar.DAY_OF_MONTH, 1);

// 同时设置年、月、日
calendar.set(2024, Calendar.JANUARY, 1);

GregorianCalendar 的常用方法

日期计算

实例

GregorianCalendar calendar = new GregorianCalendar(2023, Calendar.NOVEMBER, 15);

// 增加10天
calendar.add(Calendar.DAY_OF_MONTH, 10);

// 减少2个月
calendar.add(Calendar.MONTH, -2);

比较日期

实例

GregorianCalendar cal1 = new GregorianCalendar(2023, Calendar.NOVEMBER, 15);
GregorianCalendar cal2 = new GregorianCalendar(2023, Calendar.DECEMBER, 25);

// 比较两个日期
int result = cal1.compareTo(cal2);  // cal1在cal2之前返回负数,之后返回正数,相等返回0

// 判断是否在某个日期之前
boolean isBefore = cal1.before(cal2);

// 判断是否在某个日期之后
boolean isAfter = cal1.after(cal2);

判断闰年

实例

// 判断指定年份是否为闰年
boolean isLeapYear = new GregorianCalendar().isLeapYear(2024);

转换为 Date 对象

实例

GregorianCalendar calendar = new GregorianCalendar();
Date date = calendar.getTime();

从 Date 对象设置

实例

Date date = new Date();
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);

日期格式化输出

GregorianCalendar 本身不提供格式化的方法,但可以结合 SimpleDateFormat 使用:

实例

GregorianCalendar calendar = new GregorianCalendar(2023, Calendar.NOVEMBER, 15, 14, 30);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(calendar.getTime());
System.out.println(formattedDate);  // 输出: 2023-11-15 14:30:00

注意事项

月份从 0 开始

GregorianCalendar 中月份是从 0 开始的,0 表示 1 月,11 表示 12 月。为了代码可读性,建议使用 Calendar 类中定义的常量:

实例

// 不推荐
new GregorianCalendar(2023, 10, 15);

// 推荐
new GregorianCalendar(2023, Calendar.NOVEMBER, 15);

线程安全性

GregorianCalendar 不是线程安全的,如果多线程环境下需要使用,应该进行同步处理或为每个线程创建单独的实例。

替代方案

在 Java 8 及以上版本,推荐使用新的日期时间 API (java.time 包中的类),如 LocalDate、LocalDateTime 等,它们设计更合理,使用更方便。


完整示例

实例

import java.util.GregorianCalendar;
import java.util.Calendar;
import java.text.SimpleDateFormat;

public class GregorianCalendarExample {
    public static void main(String[] args) {
        // 创建当前日期的实例
        GregorianCalendar calendar = new GregorianCalendar();
       
        // 显示当前日期和时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间: " + sdf.format(calendar.getTime()));
       
        // 判断今年是否为闰年
        int year = calendar.get(Calendar.YEAR);
        boolean isLeap = calendar.isLeapYear(year);
        System.out.println(year + "年" + (isLeap ? "是" : "不是") + "闰年");
       
        // 增加30天
        calendar.add(Calendar.DAY_OF_MONTH, 30);
        System.out.println("30天后: " + sdf.format(calendar.getTime()));
       
        // 创建特定日期的实例
        GregorianCalendar birthday = new GregorianCalendar(1990, Calendar.JULY, 15);
        System.out.println("生日: " + sdf.format(birthday.getTime()));
    }
}

方法总结

GregorianCalendar 是 Calendar 的具体实现类,以下是其常用方法:

构造方法

方法 描述
GregorianCalendar() 使用默认时区和语言环境创建对象
GregorianCalendar(int year, int month, int dayOfMonth) 指定年、月、日创建对象
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute) 指定年、月、日、时、分创建对象
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second) 指定年、月、日、时、分、秒创建对象
GregorianCalendar(Locale locale) 使用默认时区和指定语言环境创建对象
GregorianCalendar(TimeZone zone) 使用指定时区和默认语言环境创建对象
GregorianCalendar(TimeZone zone, Locale locale) 使用指定时区和语言环境创建对象

特有方法

方法 描述
boolean isLeapYear(int year) 判断指定年份是否为闰年
void setGregorianChange(Date date) 设置儒略历到公历的转换日期
Date getGregorianChange() 获取儒略历到公历的转换日期

继承自 Calendar 的常用方法

方法 描述
int get(int field) 获取指定字段的值
void set(int field, int value) 设置指定字段的值
void add(int field, int amount) 添加或减去指定的时间量
void roll(int field, int amount) 在不更改更大字段的情况下添加或减去时间量
boolean after(Object when) 判断是否在指定时间之后
boolean before(Object when) 判断是否在指定时间之前
long getTimeInMillis() 返回时间值(毫秒)
void setTimeInMillis(long millis) 用毫秒时间值设置Calendar
Date getTime() 返回对应的Date对象
void setTime(Date date) 使用Date设置时间

字段常量(继承自Calendar)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

字段 描述
YEAR 年字段
MONTH 月字段(0-11)
DATE / DAY_OF_MONTH 月中的天数
DAY_OF_WEEK 星期几(1-7,1=周日)
HOUR 12小时制的小时
HOUR_OF_DAY 24小时制的小时
MINUTE 分钟
SECOND
MILLISECOND 毫秒
AM_PM 上午或下午