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 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); // 获取秒
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);
// 设置年份
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);
// 增加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);
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);
boolean isLeapYear = new GregorianCalendar().isLeapYear(2024);
转换为 Date 对象
实例
GregorianCalendar calendar = new GregorianCalendar();
Date date = calendar.getTime();
Date date = calendar.getTime();
从 Date 对象设置
实例
Date date = new Date();
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(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
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);
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()));
}
}
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 |
上午或下午 |
点我分享笔记