一、Calendar类 简介
在java中时间类主要有Date、Calendar,Java官方推荐使用Calendar来替换Date的使用,Calendar与Date之间可以自由的进行转换,转换的纽带是time。
java.util.Calendar 类是一个抽象类,它为特定时间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
二、Calendar类中的常量
字段值 | 含义 |
---|---|
public final static int ERA = 0; | |
public final static int YEAR = 1; | 默认情况下指示为年份 |
public final static int MONTH = 2; | 月份(从 0 开始,也就是全年 12 个月由 0 ~ 11 进行表示) |
public final static int WEEK_OF_YEAR = 3; | 当前时间是所在当前年的第几个星期(日历式的第几周) |
public final static int WEEK_OF_MONTH = 4; | 当前时间是所在当前月的第几个星期(日历式的第几周) |
public final static int DATE = 5; | 某月的第几天 |
public final static int DAY_OF_MONTH = 5; | 某月的第几天 |
public final static int DAY_OF_YEAR = 6; | 一年的第几天 |
public final static int DAY_OF_WEEK = 7; | 一周中的第几天,用数字(1-7)表示(星期日~星期六) |
public final static int DAY_OF_WEEK_IN_MONTH = 8; | 当前时间是所在当前月的第几个星期 以月份天数为标准,一个月的1号为第一周,8号为第二周 |
public final static int AM_PM = 9; | 判断当前时间是AM,还是PM,若是AM返回结果为0,若是PM返回结果为1 |
public final static int HOUR = 10; | 时(12小时制) |
public final static int HOUR_OF_DAY = 11; | 时(24小时制) |
public final static int MINUTE = 12; | 分 |
public final static int SECOND = 13; | 秒 |
public final static int MILLISECOND = 14; | 毫秒 |
public final static int ZONE_OFFSET = 15; | |
public final static int DST_OFFSET = 16; | |
public final static int FIELD_COUNT = 17; | |
public final static int SUNDAY = 1; | 星期天 |
public final static int MONDAY = 2; | 星期一 |
public final static int TUESDAY = 3; | 星期二 |
public final static int WEDNESDAY = 4; | 星期三 |
public final static int THURSDAY = 5; | 星期四 |
public final static int FRIDAY = 6; | 星期五 |
public final static int SATURDAY = 7; | 星期六 |
public final static int JANUARY = 0; | |
public final static int FEBRUARY = 1; | |
public final static int MARCH = 2; | |
public final static int APRIL = 3; | |
public final static int MAY = 4; | |
public final static int JUNE = 5; | |
public final static int JULY = 6; | |
public final static int AUGUST = 7; | |
public final static int SEPTEMBER = 8; | |
public final static int OCTOBER = 9; | |
public final static int NOVEMBER = 10; | |
public final static int DECEMBER = 11; | |
public final static int UNDECIMBER = 12; | |
public final static int AM = 0; | 上午 |
public final static int PM = 1; | 下午 |
三、Calendar类的常用方法
3.1 构造函数
由于Calendar类的修饰符是protected,所以无法直接创建该对象,需要通过静态方法创建,返回子类对象。
// 用缺省时区和语言环境获得一个日历
public static synchronized Calendar getInstance()
// 用给定时区和缺省语言环境获得一个日历
public static synchronized Calendar getInstance(TimeZone zone)
// 用缺省时区和给定语言环境获得一个日历
public static synchronized Calendar getInstance(Locale aLocale)
// 用给的时区和给定语言环境获得一个日历
public static synchronized Calendar getInstance(TimeZone zone, Locale aLocale)
3.2 设置值
方法 | 说明 |
---|---|
public final void set(int field, int value) | 用给定的值设置时间域 |
public final void set(int year,int month,int date) | 设置年、月、日期域的数值。 year - 用于设置 YEAR 时间域的值。 month - 用于设置 MONTH 时间域的值,从0开始 date - 用于设置 DATE 时间域的值。 |
public final void set(int year,int month,int date,int hour,int minute) | 设置年、月、日期、时、分的数值。 year - 用于设置 YEAR 时间域的值。 month - 用于设置 MONTH 时间域的值,从0开始 date - 用于设置 DATE 时间域的值。 hour - 用于设置 HOUR 时间域的值。 minute - 用于设置 MINUTE 时间域的值。 |
public final void set(int year,int month,int date,int hour,int minute,int second) | 设置年、月、日期、时、分的数值。 year - 用于设置 YEAR 时间域的值。 month - 用于设置 MONTH 时间域的值,从0开始 date - 用于设置 DATE 时间域的值。 hour - 用于设置 HOUR 时间域的值。 minute - 用于设置 MINUTE 时间域的值。 second - 用于设置 SECOND 时间域的值 |
public final void setTime(Date date) | 用给定的 Date 设置 Calendar 的当前时间 |
protected void setTimeInMillis(long millis) | 用给定的长整数设置 Calendar 的当前时间 |
public void setTimeZone(TimeZone value) | 用给定的时区值设置时区 |
3.3 获取值
方法 | 说明 |
---|---|
public final int get(int field) | 获得给定时间域的值 |
public static synchronized Locale[] getAvailableLocales() | 获得安装 Calendars 的语言环境集合 |
public final Date getTime() | 获得日历的当前时间 |
protected long getTimeInMillis() | 当前时间,作为从开始时间的 UTC 毫秒值 |
public final void clear() | 将所有时间域值清零 |
public final void clear(int field) | 将给定的时间域值清零 |
public int getFirstDayOfWeek() | 获得一周的第一天 |
3.4 比较值
- 比较两个 Calendar 对象表示的时间值, 如果参数表示的时间等于此 Calendar 表示的时间,则返回 0 值;
- 如果此 Calendar 的时间在参数表示的时间之前,则返回小于 0 的值;
- 如果此 Calendar 的时间在参数表示的时间之后,则返回大于 0 的值。
方法 | 说明 |
---|---|
public abstract boolean equals(Object obj) | 比较该日历和指定的对象 |
public abstract boolean before(Object when) | 如果Calendar日期对象在 when 的时间之前则为 true;否则为 false。 |
public abstract boolean after(Object when) | 如果Calendar日期对象在 when 的时间之后则为 true;否则为 false。 |
public abstract void add(int field,int amount) | 为当前Calendar日期对象加上或减去指定的时间量 |
private int compareTo(long t) | 比较两个 Calendar 对象表示的时间值。 如果参数表示的时间等于此 Calendar 表示的时间,则返回 0 值; 如果此 Calendar 的时间在参数表示的时间之前,则返回小于 0 的值; 如果此 Calendar 的时间在参数表示的时间之后,则返回大于 0 的值。 |
3.5 计算值
方法 | 说明 |
---|---|
public int getActualMaximum(int field) | 获得给定时间域可能拥有的实际最大值 |
public int getActualMinimum(int field) | 获得给定时间域可能拥有的实际最小值 |
public abstract int getMinimum(int field) | 获得给定时间域最小值 |
public abstract int getMaximum(int field) | 获得给定时间域最大值 |
四、实例
- 基本示例
public class WorkCalendarHelper { private final static String[] WEEKS = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; public static void main(String[] args) { // 使用Calendar的getInstance()取得一个Calendar的实例 Calendar calendar = Calendar.getInstance(); // 初始化 Calendar 对象,但并不必要,除非需要重置时间 calendar.setTime(new Date()); // 获取时间值 System.out.println(calendar.getTime()); // 显示年份 System.out.println("年份为:" + calendar.get(Calendar.YEAR)); //显示月份(Calendar 的 month 从 0 开始,也就是全年 12 个月由 0 ~ 11 进行表示。) System.out.println("月份为:" + (calendar.get(Calendar.MONTH) + 1)); //日 System.out.println("日期为:" + calendar.get(Calendar.DATE)); //星期 System.out.println("星期为:" + WEEKS[calendar.get(Calendar.DAY_OF_WEEK) - 1]); // System.out.println("日期为:" + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); // 某月第 N 天 System.out.println("本月第 " + calendar.get(Calendar.DAY_OF_MONTH) + " 天"); // 今年的第 N 天 System.out.println("今年的第 " + calendar.get(Calendar.DAY_OF_YEAR) + " 天"); // 获取上午跟下午 System.out.println(calendar.get(Calendar.AM_PM) == 0 ? "上午" : "下午"); //时 System.out.println("时为:" + calendar.get(Calendar.HOUR)); // 获取时,默认24小时制 System.out.println("时为:" + calendar.get(Calendar.HOUR_OF_DAY)); // 分 System.out.println("分钟数为:" + calendar.get(Calendar.MINUTE)); //秒 System.out.println("秒为:" + calendar.get(Calendar.SECOND)); //毫秒 System.out.println("毫秒为:" + calendar.get(Calendar.MILLISECOND)); System.out.println("月的周数:" + calendar.get(Calendar.WEEK_OF_MONTH)); System.out.println("年的周数:" + calendar.get(Calendar.WEEK_OF_YEAR)); System.out.println("历型为:" + calendar.get(Calendar.ERA)); System.out.println("zone为:" + calendar.get(Calendar.ZONE_OFFSET)); } }
- 获取某年所有日期
public static List<Map<String,Object>> initCalendar(int year) { List<Map<String,Object>> resultList = new ArrayList<>(); Calendar calendar = Calendar.getInstance(); int monthSum = 12; for (int i = 0; i < monthSum; i++) { calendar.set(year, i, 1); // 获取某月最小天数 int monthMin = calendar.getActualMinimum(Calendar.DAY_OF_MONTH); // 获取某月最大天数 int monthMax = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); Map<String,Object> workCalendar; String timeCode; for (int day = monthMin; day <= monthMax; day++) { workCalendar = new HashMap<String,Object>(4); calendar.set(year, i, day); if ((calendar.get(7) == 1) || (calendar.get(7) == 7)) { timeCode = "sys_weekend"; } else { timeCode = "sys_workday"; } // 工作时间编码 workCalendar.put("timeCode",timeCode); // 年份 workCalendar.put("year",year); // 月份 workCalendar.put("month",(i+1)); // 天 workCalendar.put("day",day); resultList.add(workCalendar); } } return resultList; }
- 获取当前月所有日期
/** * 获取当前月所有日期 */ public static List<Map<String, Object>> currentMonthDay() { List<Map<String, Object>> resultList = new ArrayList<>(); //创建日历 Calendar ca = Calendar.getInstance(); //设置时间 ca.setTime(new Date()); //将时间调整到当前日历月份最后一天 ca.set(ca.get(Calendar.YEAR), ca.get(Calendar.MONTH) + 1, 0); //获取当前日历月份的实际总天数 int dayNumOfMonth = ca.get(Calendar.DAY_OF_MONTH); //将日历时间指向当前日历月份的一号 ca.set(Calendar.DAY_OF_MONTH, 1); Map<String, Object> workCalendar; String timeCode; for (int i = 0; i < dayNumOfMonth; i++, ca.add(Calendar.DATE, 1)) { workCalendar = new HashMap<String, Object>(4); //设置为0时0分0秒0毫秒 ca.set(Calendar.HOUR_OF_DAY, 0); ca.set(Calendar.MINUTE, 0); ca.set(Calendar.SECOND, 0); ca.set(Calendar.MILLISECOND, 0); if ((ca.get(7) == 1) || (ca.get(7) == 7)) { timeCode = "sys_weekend"; } else { timeCode = "sys_workday"; } // 工作时间编码 workCalendar.put("timeCode", timeCode); // 年份 workCalendar.put("year", ca.get(Calendar.YEAR)); // 月份 workCalendar.put("month", (ca.get(Calendar.MONTH) + 1)); // 天 workCalendar.put("day", ca.get(Calendar.DAY_OF_MONTH)); resultList.add(workCalendar); } return resultList; }
- 获取当前周所有日期
/** * 获取本周所有的日期,按时间先后排序 */ public static List<Map<String, Object>> currentMeekDay() { List<Map<String, Object>> resultList = new ArrayList<>(); //创建日历 Calendar ca = Calendar.getInstance(); //设置时间 ca.setTime(new Date()); //设置周一为每周的第一天 ca.setFirstDayOfWeek(Calendar.MONDAY); //将Calendar日期对象指向本周的周一 ca.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); Map<String, Object> workCalendar; String timeCode; for (int i = 0; i < 7; i++, ca.add(Calendar.DATE, 1)) { workCalendar = new HashMap<String, Object>(4); //将日历时间调整为0时0分0秒 ca.set(Calendar.HOUR_OF_DAY, 0); ca.set(Calendar.MINUTE, 0); ca.set(Calendar.SECOND, 0); ca.set(Calendar.MILLISECOND, 0); //将时间添加到list列表 if ((ca.get(7) == 1) || (ca.get(7) == 7)) { timeCode = "sys_weekend"; } else { timeCode = "sys_workday"; } // 工作时间编码 workCalendar.put("timeCode", timeCode); // 年份 workCalendar.put("year", ca.get(Calendar.YEAR)); // 月份 workCalendar.put("month", (ca.get(Calendar.MONTH) + 1)); // 天 workCalendar.put("day", ca.get(Calendar.DAY_OF_MONTH)); resultList.add(workCalendar); } return resultList; }