Java 日历
java.util.Date 类可以用于获取一个日期对象
但如果我们想要设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢?
java.util.Calendar 类提供了这些功能
Calendar 类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用 getInstance 方法创建即可
创建一个代表系统当前日期的 Calendar 对象
Calendar c = Calendar.getInstance();//默认是当前日期
创建一个指定日期的 Calendar 对象
使用 getInstance()
方法获取了一个 Calendar 对象后,我们就可以使用 set() 方法设置一个特定的日期
//创建一个代表2009年6月12日的Calendar对象 Calendar c1 = Calendar.getInstance(); c1.set(2009, 6 - 1, 12);
Calendar 类常量
Calendar 类中用以下这些常量表示不同的意义
常量 | 描述 |
---|---|
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期,和上面的字段意义完全相同 |
Calendar.HOUR | 12小时制的小时 |
Calendar.HOUR_OF_DAY | 24小时制的小时 |
Calendar.MINUTE | 分钟 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期几 |
Calendar 类实例信息的设置
1. set() 方法
set() 方法原型如下
public final void set(int year,int month,int date)
调用方式
Calendar c1 = Calendar.getInstance(); c1.set(2009, 6 - 1, 12); // 设置 c1 的年月日为:2009、6、12
如果只设定某个字段,例如日期的值,则可以使用如下 set 方法
public void set(int field,int value)
把 c1 对象代表的日期设置为10号,其它所有的数值会被重新计算
c1.set(Calendar.DATE,10);
把 c1 对象代表的年份设置为2008年,其他的所有数值会被重新计算
c1.set(Calendar.YEAR,2008);
2. add() 方法
add() 与 set() 方法类似
把 c1 对象的日期加上 10,也就是 c1 也就表示为 10 天后的日期,其它所有的数值会被重新计算
Calendar c1 = Calendar.getInstance(); c1.add(Calendar.DATE, 10);
把 c1 对象的日期减去 10,也就是 c1 也就表示为 10 天前的日期,其它所有的数值会被重新计算
Calendar c1 = Calendar.getInstance(); c1.add(Calendar.DATE, -10);
获取 Calendar 类对象信息
Calendar c1 = Calendar.getInstance(); // 获得年份 int year = c1.get(Calendar.YEAR); // 获得月份 int month = c1.get(Calendar.MONTH) + 1; // 获得日期 int date = c1.get(Calendar.DATE); // 获得小时 int hour = c1.get(Calendar.HOUR_OF_DAY); // 获得分钟 int minute = c1.get(Calendar.MINUTE); // 获得秒 int second = c1.get(Calendar.SECOND); // 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推) int day = c1.get(Calendar.DAY_OF_WEEK);
GregorianCalendar类
Calendar 类实现了公历日历
GregorianCalendar 是 Calendar 类的一个具体实现
Calendar 的 getInstance()方法返回一个默认用当前的语言环境和时区初始化的 GregorianCalendar 对象
GregorianCalendar 定义了两个字段:AD 和 BC,表示公历定义的两个时代
下表列出了 GregorianCalendar 对象的几个构造方法
序号 | 构造函数和说明 |
---|---|
1 | GregorianCalendar() 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar |
2 | GregorianCalendar(int year, int month, int date) 在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar |
3 | GregorianCalendar(int year, int month, int date, int hour, int minute) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar |
4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar |
5 | GregorianCalendar(Locale aLocale) 在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar |
6 | GregorianCalendar(TimeZone zone) 在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar |
7 | GregorianCalendar(TimeZone zone, Locale aLocale) 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar |
下表则列出了 GregorianCalendar 类提供的一些有用的方法
序号 | 方法和说明 |
---|---|
1 | void add(int field, int amount) 根据日历规则,将指定的(有符号的)时间量添加到给定的日历字段中 |
2 | protected void computeFields() 转换 UTC 毫秒值为时间域值 |
3 | protected void computeTime() 覆盖Calendar ,转换时间域值为UTC毫秒值 |
4 | boolean equals(Object obj) 比较此 GregorianCalendar 与指定的 Object |
5 | int get(int field) 获取指定字段的时间值 |
6 | int getActualMaximum(int field) 返回当前日期,给定字段的最大值 |
7 | int getActualMinimum(int field) 返回当前日期,给定字段的最小值 |
8 | int getGreatestMinimum(int field) 返回此 GregorianCalendar 实例给定日历字段的最高的最小值 |
9 | Date getGregorianChange() 获得格里高利历的更改日期 |
10 | int getLeastMaximum(int field) 返回此 GregorianCalendar 实例给定日历字段的最低的最大值 |
11 | int getMaximum(int field) 返回此 GregorianCalendar 实例的给定日历字段的最大值 |
12 | Date getTime() 获取日历当前时间 |
13 | long getTimeInMillis() 获取用长整型表示的日历的当前时间 |
14 | TimeZone getTimeZone() 获取时区 |
15 | int getMinimum(int field) 返回给定字段的最小值 |
16 | int hashCode() 重写 hashCode |
17 | boolean isLeapYear(int year) 确定给定的年份是否为闰年 |
18 | void roll(int field, boolean up) 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段 |
19 | void set(int field, int value) 用给定的值设置时间字段 |
20 | void set(int year, int month, int date) 设置年、月、日的值 |
21 | void set(int year, int month, int date, int hour, int minute) 设置年、月、日、小时、分钟的值 |
22 | void set(int year, int month, int date, int hour, int minute, int second) 设置年、月、日、小时、分钟、秒的值 |
23 | void setGregorianChange(Date date) 设置 GregorianCalendar 的更改日期 |
24 | void setTime(Date date) 用给定的日期设置Calendar的当前时间 |
25 | void setTimeInMillis(long millis) 用给定的long型毫秒数设置Calendar的当前时间 |
26 | void setTimeZone(TimeZone value) 用给定时区值设置当前时区 |
27 | String toString() 返回代表日历的字符串 |
范例
下面的范例演示了部分方法的使用
import java.util.*; public class GregorianCalendarDemo { public static void main(String args[]) { String months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; int year; // 初始化 Gregorian 日历 // 使用当前时间和日期 // 默认为本地时间和时区 GregorianCalendar gcalendar = new GregorianCalendar(); // 显示当前时间和日期的信息 System.out.print("Date: "); System.out.print(months[gcalendar.get(Calendar.MONTH)]); System.out.print(" " + gcalendar.get(Calendar.DATE) + " "); System.out.println(year = gcalendar.get(Calendar.YEAR)); System.out.print("Time: "); System.out.print(gcalendar.get(Calendar.HOUR) + ":"); System.out.print(gcalendar.get(Calendar.MINUTE) + ":"); System.out.println(gcalendar.get(Calendar.SECOND)); // 测试当前年份是否为闰年 if(gcalendar.isLeapYear(year)) { System.out.println("当前年份是闰年"); } else { System.out.println("当前年份不是闰年"); } } }
以上实例编译运行结果如下:
Date: Jan 23 2018 Time: 8:35:44 当前年份不是闰年
Calender 类的完整方法列表,可以访问我们的 Java 文档