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

在这里插入图片描述

一、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;
    }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独泪了无痕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值