Java Calendar的使用,一看就会的那种_List

一、Calendar类 简介

  在java中时间类主要有DateCalendar,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;
}